小编给大家分享一下Java多线程中Callable、Future和FutureTask是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
前言:
创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。
这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。
如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。
而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果
1 Callable介绍
Callable
接口代表一段可以调用并返回结果的代码;Future接口表示异步任务,是还没有完成的任务给出的未来结果。所以说Callable
用于产生结果,Future
用于获取结果。
Callable
接口使用泛型去定义它的返回类型。Executors
类提供了一些有用的方法在线程池中执行Callable
内的任务。由于Callable
任务是并行的(并行就是整体看上去是并行的,其实在某个时间点只有一个线程在执行),我们必须等待它返回的结果。java.util.concurrent.Future
对象为我们解决了这个问题。在线程池提交Callable
任务后返回了一个Future
对象,使用它可以知道Callable
任务的状态和得到Callable
返回的执行结果。Future
提供了get()
方法让我们可以等待Callable
结束并获取它的执行结果。
2 Future介绍
2.1 在Future接口中声明方法
在Future接口中声明5种方法下面依次解释每个方法的作用:
2.2 Future提供了三种功能
1)判断任务是否完成;
2)能够中断任务;
3)能够获取任务执行结果。
因为Future只是一个接口,所以是无法直接用来创建对象使用的,因此就有了下面的FutureTask。
3 FutureTask
我们先来看一下FutureTask的实现:
public class FutureTask
引用>实现RunnableFuture <代码> <强> FutureTask 强> 代码> <强>类实现了<代码> RunnableFuture 代码>接口,我们看一下<代码> RunnableFuture 代码>接口的实现:强>
public interface RunnableFuture, extends 可运行,,Future , { ,,,void 运行(); } 可以看出<代码> RunnableFuture 代码>继承了<代码>可运行代码>接口和未来<代码> 代码>接口,而<代码> FutureTask 代码>实现了<代码> RunnableFuture 代码>接口。所以它既可以作为Runnable被线程执行,又可以作为未来<代码> 代码>得到<代码>调用代码>的返回值。
<强> FutureTask提供了2个构造器:强>
public FutureTask (Callable事实上,<代码> FutureTask 代码>是<代码> 代码>未来接口的一个唯一实现类。
4未来和FutureTask的使用
4.1使用可调用+未来获取执行结果
public class CallableFutureTest { ,,,public static void main (String [], args), { ,,,,,,,//创建线程池 ,,,,,,,ExecutorService es =, Executors.newSingleThreadExecutor (); ,,,,,,,//创建可调用的对象任务 ,,,,,,,CallableDemo calTask =, new CallableDemo (); ,,,,,,,//提交任务并获取执行结果 ,,,,,,,Future, future =, es.submit (calTask); ,,,,,,,//关闭线程池 ,,,,,,,es.shutdown (); ,,,,,,,try { ,,,,,,,,,,,thread . sleep (2000); ,,,,,,,,,,,System.out.println(“主线程在执行其他任务“); ,,,,,,,,,,,if (future.get (), !=, null), { ,,,,,,,,,,,,,,,//输出获取到的结果 ,,,,,,,,,,,,,,,System.out.println (“future.get()——在“,+,future.get ()); ,,,,,,,,,,,},{else ,,,,,,,,,,,,,,,//输出获取到的结果 ,,,,,,,,,,,,,,,System.out.println (“future.get()未获取到结果“); ,,,,,,,,,,,} ,,,,,,,},catch (Exception e), { ,,,,,,,,,,,e.printStackTrace (); ,,,,,,,} ,,,,,,,System.out.println(“主线程在执行完成“); ,,,} } class CallableDemo  implements Callable< Integer>, { ,,,private int 总和; ,,@Override ,,,public Integer 叫(),throws Exception { null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null Java多线程中调用,未来和FutureTask是什么意思