FutureTask详解

FutureTask简介

在Executors框架体系中,FutureTask用来表示可获取结果的异步任务。FutureTask实现了Future接口,FutureTask提供了启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果的一些常用的方法。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任务执行结束。一旦任务执行结束,任务不能重新启动或取消,除非调用runAndReset()方法。在FutureTask的源码中为其定义了这些状态:

private static final int NEW          = 0;
private static final int COMPLETING   = 1;
private static final int NORMAL       = 2;
private static final int EXCEPTIONAL  = 3;
private static final int CANCELLED    = 4;
private static final int INTERRUPTING = 5;
private static final int INTERRUPTED  = 6;

另外,在《Java并发编程的艺术》一书,作者根据FutureTask.run()方法的执行的时机,FutureTask分为了3种状态:

  1. 未启动。FutureTask.run()方法还没有被执行之前,FutureTask处于未启动状态。当创建一个FutureTask,还没有执行FutureTask.run()方法之前,FutureTask处于未启动状态。

  2. 已启动。FutureTask.run()方法被执行的过程中,FutureTask处于已启动状态。

  3. 已完成。FutureTask.run()方法执行结束,或者调用FutureTask.cancel(…)方法取消任务,或者在执行任务期间抛出异常,这些情况都称之为FutureTask的已完成状态。

在这里插入图片描述

由于FutureTask具有这三种状态,因此执行FutureTask的get方法和cancel方法,当前处于不同的状态对应的结果也是大不相同。这里对get方法和cancel方法做个总结:

get方法

当FutureTask处于未启动或已启动状态时,执行FutureTask.get()方法将导致调用线程阻塞。如果FutureTask处于已完成状态,调用FutureTask.get()方法将导致调用线程立即返回结果或者抛出异常

cancel方法

当FutureTask处于未启动状态时,执行FutureTask.cancel()方法将此任务永远不会执行;

当FutureTask处于已启动状态时,执行FutureTask.cancel(true)方法将以中断线程的方式来阻止任务继续进行,如果执行FutureTask.cancel(false)将不会对正在执行任务的线程有任何影响;

FutureTask处于已完成状态时,执行FutureTask.cancel(…)方法将返回false。

对Future的get()方法和cancel()方法用下图进行总结

在这里插入图片描述

FutureTask的基本使用

FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给Executor执行,也可以由调用的线程直接执行(FutureTask.run())。另外,FutureTask的获取也可以通过ExecutorService.submit()方法返回一个FutureTask对象,然后在通过FutureTask.get()或者FutureTask.cancel方法。

应用场景:当一个线程需要等待另一个线程把某个任务执行完后它才能继续执行,此时可以使用FutureTask。假设有多个线程执行若干任务,每个任务最多只能被执行一次。当多个线程试图执行同一个任务时,只允许一个线程执行任务,其他线程需要等待这个任务执行完后才能继续执行。

参考文献《Java并发编程的艺术》

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
FutureTask是Java中的一个类,用于表示一个异步计算的结果,它实现了Runnable和Future接口。它的主要功能是对一个耗时的计算任务进行封装,该任务会在另一个线程中异步执行,并且可以获取到其执行结果。 FutureTask使用非常简单,首先创建一个FutureTask对象,将需要执行的计算任务作为参数传入。然后可以通过调用FutureTask对象的get方法来获取计算结果,该方法会阻塞当前线程,直到计算任务完成并返回结果。另外,还可以通过调用FutureTask对象的cancel方法来取消计算任务的执行。 除了上述基本功能外,FutureTask还有一些其他的特性。例如,可以通过isDone方法来判断计算任务是否完成,通过isCancelled方法来判断计算任务是否被取消。另外,还可以通过传入Callable对象来创建FutureTask,这样可以更加灵活地指定计算任务。 FutureTask的一个常见应用场景是在多线程编程中,用于执行一些耗时的计算任务,而不阻塞主线程的执行。通过将计算任务封装为FutureTask,在主线程中可以继续执行其他操作,而不需要等待计算任务完成。当需要获取计算结果时,再通过调用FutureTask的get方法来获取结果,从而实现了异步计算和获取结果的功能。 总之,FutureTask是Java中用于表示异步计算结果的类,它提供了一些方法来控制和获取计算任务的结果,通过它可以实现多线程编程中的异步计算和获取结果的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值