java实现多线程的三种方法,java实现多线程的两种方法
本文给大家带来一些java的相关知识,包括实现多线程的四种方式,包括继承Thread类,通过FutureTask包装器实现可调用接口创建线程Thread,使用ExecutorService,Callable,Future实现多线程并返回结果等。来看看吧,希望对你有帮助。
如何解决写爬虫IP受阻的问题?立即使用。
Java多线程实现方式主要有四种类型:
继承线程类并实现Runnable接口
实现可调用接口,通过FutureTask包装器创建线程Thread。
使用ExecutorService,可调用
Future实现多线程并返回结果。
前两个方法在线程执行后没有返回值,后两个方法有返回值。
一、四种方式实现多线程
1、继承Thread类创建线程
线程类本质上是一个实现Runnable接口的实例,代表一个线程的实例。启动线程的唯一方法是通过Thread类的start()实例方法。start()方法是一个本机方法,它将启动一个新线程并执行run()方法。这样实现多线程非常简单。您可以启动一个新线程并执行您自己定义的run()方法,方法是通过您自己的类直接扩展线程并覆盖run()方法。例如:
公共类MyThread扩展线程{
公共无效运行(){
system . out . println( myth read . run());
}
}
MyThread MyThread 1=new MyThread();
MyThread MyThread 2=new MyThread();
mythread 1 . start();
mythread 2 . start();
2、实现Runnable接口创建线程
如果您的类已经扩展了另一个类,则不能直接扩展线程。此时,您可以实现一个Runnable接口,如下所示:
公共类MyThread扩展OtherClass实现Runnable {
公共无效运行(){
system . out . println( myth read . run());
}
}为了启动MyThread,您需要首先实例化一个线程,并传入您自己的MyThread实例:
MyThread MyThread=new MyThread();
Thread thread=新线程(myThread);
thread . start();事实上,当一个可运行的目标参数传递给Thread时,Thread的run()方法会调用target.run()。参考JDK源代码:
公共无效运行(){
如果(目标!=null) {
target . run();
}
}
3、实现Callable接口通过FutureTask包装器来创建Thread线程
可调用接口(且只有一个方法)定义如下:
公共接口CallableV {
V call()抛出异常;}
公共类SomeCallableV扩展OtherClass实现CallableV {
@覆盖
公共V调用()引发异常{
//TODO自动生成的方法存根
返回null
}
} CallableV one callable=new some CallableV();
//通过CallableInteger创建FutureTaskInteger对象:
FutureTaskV oneTask=新FutureTaskV(one callable);
//注意:FutureTaskInteger是一个包装器,通过接受CallableInteger来创建。它实现了未来的和可运行的接口。
//通过FutureTaskInteger创建一个线程对象:
Thread oneThread=新线程(one task);
one thread . start();//此时,创建了一个线程。
4、使用ExecutorService、Callable、Future实现有返回结果的线程
ExecutorService、Callable和Future接口都属于Executor的框架。返回结果的线程是JDK1.5中引入的新特性,有了这个特性,就不需要大费周章地获取返回值了。而你自己意识到的话,可能漏洞百出。
可以返回值的任务必须实现可调用接口。类似地,没有返回值的任务必须实现Runnable接口。
可调用任务执行后,可以得到一个Future对象,在这个对象上调用get就可以得到可调用任务返回的对象。
注意:get方法被阻塞,即线程不返回结果,get方法会一直等待。
结合线程池接口ExecutorService,可以实现传说中的返回结果的多线程。
下面提供一个完整的多线程测试示例,并返回结果,在JDK1.5下验证后可以直接使用,代码如下:
导入Java . util . concurrent . *;
导入Java . util . date;
导入Java . util . list;
导入Java . util . ArrayList;
/**
*具有返回值的线程
*/
@SuppressWarnings(未选中)
公共类测试{
公共静态void main(String[] args)引发执行异常,
中断的异常{
System.out.println( -程序开始运行- );
日期日期1=新日期();
int taskSize=5;
//创建一个线程池
执行者服务池=执行者。newfixedthreadpool(taskSize);
//创建多个有返回值的任务
list future list=new ArrayList future();
for(int I=0;I任务大小i ) {
callable c=new my callable(I );
//执行任务并获取将来的对象
未来f=池。提交(c);
//系统。出去。println( f . get().toString());
列表。添加(f);
}
//关闭线程池
游泳池。关闭();
//获取所有并发任务的运行结果
对于(未来女:列表){
//从将来的对象上获取任务的返回值,并输出到控制台
系统。出去。println( f . get().toString());
}
日期日期2=新日期();
System.out.println( -程序结束运行- ,程序运行时间【
date2.getTime() - date1.getTime()毫秒】);
}
}
MyCallable类实现CallableObject {
私有字符串taskNum
MyCallable(String taskNum) {
这个。任务编号=任务编号;
}
公共对象调用()引发异常{
系统。出去。println( taskNum 任务启动);
日期日期1=新日期();
线程。睡眠(1000);
日期日期Tmp2=新日期();
长时间=日期tmp 2。gettime()-date tmp 1。gettime();
系统。出去。println( taskNum 任务终止);
return taskNum 任务返回运行结果,当前任务时间【时间毫秒】;
}
}
二、多线程相关知识
1.Runnable 和 Callable 的区别?
2. 如何启动一个新线程、调用 start 和 run 方法的区别?
3.线程相关的基本方法?
5.wait()和 sleep()的区别?
6.多线程原理
推荐学习: 《java视频教程》 以上就是爪哇实现多线程的四种方式的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。