在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种状态:

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

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

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

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

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

参考文献

《java并发编程的艺术》

java futuretask 状态_6.3 FutureTask基本操作总结 - JAVA 并发知识点总结相关推荐

  1. java机器学习库_6大最常用的Java机器学习库一览

    在 MLOSS.org 网站上,列出了 70 多个基于 Java 的开源机器学习项目,可能还有更多未列出的项目,存于大学里的服务器.GitHub 或 Bitbucket 中.我们将在本文中回顾 Jav ...

  2. java futuretask 状态_java并发编程之FutureTask

    引言 FutureTask实现了接口Future,同Future一样,代表异步计算的结果.当然,FutureTask除了实现Future接口之外,还实现了Runnable接口,所以,FutureTas ...

  3. java runnable wait_面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...

    摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...

  4. Java 8状态更新

    即将到来的Java SE 8发行版的两大新语言功能是Lambda Expressions和Modularity. 对于这两者,这些天的状态更新已经发布. 我会与您共享链接,因此您可能会在假期中通读它们 ...

  5. new thread后会阻塞主程序吗_阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...

    使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...

  6. 既然阻塞 I/O 会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

    使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成.这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态 ...

  7. java线程状态和状态切换

    背景 先来探讨一个关于多线程的基础知识:java线程有多少种状态?根据JDK定义,答案是六种!为什么很多人给出的答案却是五种呢?这极有可能是将操作系统层面的线程状态和java线程状态混为一潭了.因为, ...

  8. Java基于POI对PPT的基本操作

    Java基于POI对PPT的基本操作 在Java中对PPT文件进行操作的话,我使用的是Apache的开源项目POI.该项目的功能主要是使用Java开发或生成微软办公文件,比如:Word.Excel.P ...

  9. Java改知能机_Java 面试突击之 Java 并发知识基础 进阶考点全解析

    版权说明:本文内容根据 github 开源项目整理所得 项目地址:https://github.com/Snailclimb/JavaGuide​github.com 一.基础 什么是线程和进程? 何 ...

  10. Java Review - 线程池使用FutureTask的小坑

    文章目录 概述 问题复现 源码分析 解决办法 小结 概述 先说结论 线程池使用FutureTask时如果把拒绝策略设置为 DiscardPolicy和 DiscardOldestPolicy,并且在被 ...

最新文章

  1. python创建图片对应的csv格式_Python:如何从csv文件创建图形节点和边?
  2. 编译原理练习题(第三章)
  3. 解决数据库里表字段带下划线,实体类转小驼峰,Mapper的映射问题
  4. C# 对字符进行UrlEncode/UrlDecode
  5. Dart_VM的相关简介与运行模式解析
  6. java连接本地oracle数据库_JAVA连接oracle数据库的三种方式
  7. (转)基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案
  8. 萨默尔机器人_助力产业发展 西安市人工智能机器人学会正式成立
  9. Nginx端口映射(外网访问)
  10. 通过VS2010性能分析来查找代码中那些地方最损耗资源
  11. 多个字段排序_SQL | 汇总分析、排序、运行顺序
  12. Java进阶:SpringMVC拦截器
  13. RMI、RPC、SOAP通信技术介绍及比对
  14. Excel 2016中的新增函数之SWITCH
  15. 《高等代数学》(姚慕生),习题1.1:二阶行列式
  16. 初探OSG+OpenCascade(简称:OCC)在QT上的实践
  17. HDFS Shell 命令简介及查询
  18. R语言字符串相关操作
  19. A19-Python基础之lambda匿名函数-过滤器-映射
  20. 关闭苹果无线服务器,苹果iOS11 WiFi、蓝牙无法关闭怎么回事?附彻底关闭方法...

热门文章

  1. 2021-10-12
  2. 2021-02-13
  3. 你缺的不是时间而是专注力
  4. unity C#计时器,记录程序运行时长
  5. Python 学习小记
  6. Atitit 业务流程执行引擎的实现 目录 1.1. 引擎实现语言java js php等 1 1.2. 流程语言 xml sql js等 业务流程定义语言规范总结 1 1.3. 实体方法定义 2
  7. Atitit 文档全文索引的索引种类 用于文本数据挖掘 搜索 数据分析 目录 1.1. Txt摘要索引。。 1 1.2. File placeholder 索引 1 1.3. Lucence索引 1
  8. Atitit attilax提出的软件开发发展趋势与概念 1. 长期化 复用化 跨平台 可移植性 1 2. 通用化 通用 化的渠道至少有3种 1 2.1. 模块化 1 2.2. 标准化接口 1 2
  9. atitit 项目注册功能算法attilax总结.docx
  10. Atitit.cto 与技术总监的区别