Java多线程中调用,未来和FutureTask是什么意思

  

小编给大家分享一下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种方法下面依次解释每个方法的作用:

Java多线程中Callable、Future和FutureTask是什么意思

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是什么意思