网站首页 > 文章精选 正文
多线程的方式能够在操作系统的多核配置上更好的利用服务器的多个CPU的资源,这样的操作可以使得程序运行起来更加高效。Java中多线程机制提供了在一个进程内并发去执行多个线程,并且每个线程都并行的去执行属于线程处理的自己的任务,这样可以提高程序的执行效率,让系统资源得到更加的高效的利用。
Java线程中线程的创建方式
Java多线程中创建线程的方式有以下四种
- 1、继承Thread类
- 2、实现Runnable接口
- 3、通过ExecutorService和Callable<Class>实现有返回值的线程操作
- 4、基于线程池实现
继承Thread类
Thread类自己也是实现了Runnbale接口并且定义了操作线程的方法,通过继承Thread类的方式来创建一个线程。如下所示
public TestThread extends Thread{
public void run(){
}
}
public class Test{
public static void main(String[] args){
TestThread testThread = new TestThread();
testThread.start();
}
}
首先创建一个类并且继承了Thread接口,然后实例化线程对象并且调用其start()方法来启动线程。start方法是一个native方法,通过在操作系统上启动一个新线程,并且最终执行run方法来启动一个线程。run方法的内部是线程具体的实现代码。
实现Runnble接口
基于Java编程规范,如果子类已经继承了一个类,那么就没有办法直接继承Thread类了,因为Java是单继承的方式。这个时候就可以通过实现Runnbale接口创建线程。
public class ChildTestClass extends SuperClass implements Runnable{
public void run(){
}
}
ChildTestClass childTestClass = new ChildTestClass();
Thread thread = new Thread(childTestClass);
thread.start();
通过实现Runnbale接口创建了一个ChildTestClass线程类,并且创建了对应的线程类对象,创建一个Thread的类并且以该对象作为参数传入,并且使用Thread 的start()方法启动线程执行run()方法中的执行逻辑
通过ExecutorService和Callable<Class>实现有返回值的线程
在实际开发中,会有这样一个场景,我们在主线程中开启了很多子线程,然后执行不同的处理任务,然后需要收集到各个子线程的返回结果,并且将结果进行汇总,这个时候就需要使用到Callable接口来进行操作。
具体的实现方法如下
public class MyCallable implements Callable<String>{
private String name;
// 通过构造函数传入参数作为线程的名称
public MyCallable(String name){
this.name = name;
}
// call方法内为线程实现的逻辑处理操作
@Override
public String call() throws Exception{
return name;
}
}
// 创建一个固定大小为5的线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
// 创建多个有返回值的任务列表
List<Future> list = new ArrayList<Future>();
for(int i = 0;i<5;i++){
// 创建一个有返回值的线程实例
Callable c = new MyCallable(i+"");
// 提交线程,获取Future对象并将其保存到Future List中
Future future = pool.submit(c);
list.add(future);
}
//关闭线程池,等待线程执行结束
pool.shutdown();
// 遍历获取运行结果
for(Future future:list){
future.get();
}
创建一个类并且实现Callable接口,在call方法中实现了具体的运算逻辑并且返回结算结果。具体的调用过程是,创建一个线程池、一个用于接收返回结果的Future List 以及Callable线程实例,使用线程池提交具体的任务进行执行,之后将结果保存到Future中,在执行完成之后遍历Future List中的Future对象,并且调用future对象的get方法就可以获取Callable线程任务返回具体的操作结果并且进行主线程处理。
基于线程池
线程作为一种计算资源,但是每次的创建和销毁都会浪费很多的其他资源,这个时候线程池的出现就是一种很好的资源管理策略。那么如何通过线程池来创建线程呢!
ExecutorService threadPool = Executors.newFixedThreadPool(10);
for(int i = 0;i<10;i++){
threadPool.execute(new Runnable(){
@Override
public void run(){
}
})
}
猜你喜欢
- 2024-12-27 Python启航:30天编程速成之旅(第23天)- 多线程从入门到精通
- 2024-12-27 10问10答:你真的了解线程池吗? 线程池的用法、原理
- 2024-12-27 线程池最佳线程数量到底要如何配置?
- 2024-12-27 线程池的创建方式,为什么阿里推荐自定义线程池?
- 2024-12-27 如何在C#中创建和使?线程池?请提供?例代码
- 2024-12-27 多线程编程 - 创建线程和结束线程
- 2024-12-27 创建线程池有哪几种方式? 44.创建线程池有哪几种方式?
- 2024-12-27 创建线程池的4大方法,7个参数,4种拒绝策略
- 2024-12-27 进程、线程的创建和派生详细过程 线程进程定义
- 2024-12-27 如何创建守护线程? 如何创建守护线程文件夹
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)