Future接口:它是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。

接口中有5中方法:

  1. cancel(boolean mayInterruptIfRunning)方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。
  2. isCancelled()方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。
  3. isDone()方法表示任务是否已经完成,若任务完成,则返回true;
  4. get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
  5. get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

FutureTask:它是Future具体实现类。

public class FutureTask<V> implements RunnableFuture<V> {

FutureTask类实现了RunnableFuture接口,RunnableFuture接口的实现:

public interface RunnableFuture<V> extends Runnable, Future<V> {

所以FutureTask除了实现了Future接口外还实现了Runnable接口,因此FutureTask也可以直接提交给Executor执行。 当然也可以调用线程直接执行(FutureTask.run())。

FutureTask提供两个构造器:

public FutureTask(Callable<V> callable) {
}
public FutureTask(Runnable runnable, V result) {
}

Callable+Future组合实现代码:

public class CallableTest {public static void main(String[] args) {// 第一种方式:通过线程池来获取线程ExecutorService executor = Executors.newCachedThreadPool();//创建线程池Future<Integer> future = executor.submit(new MyCallable());//ExecutorService中的submit方法接受一个Runnable或者Callable,然后返回一个Future来获得任务的执行结果或者取消任务。
        executor.shutdown();try {System.out.println("result:" + future.get());} catch (InterruptedException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (ExecutionException e) {// TODO Auto-generated catch block
            e.printStackTrace();}}}

public class MyCallable implements Callable<Integer>{@Overridepublic Integer call() throws Exception {int sum = 0;for(int i = 0;i<10;i++){sum+=i;}return sum;}
}

Callable+FutureTask组合实现代码:

public class CallableTest {public static void main(String[] args) {    //第二种方式MyCallable mc = new MyCallable();        ExecutorService executor = Executors.newCachedThreadPool();//创建线程池        FutureTask<Integer> futureTask = new FutureTask<Integer>(mc);        executor.submit(futureTask);        executor.shutdown();try {System.out.println("result:" + futureTask.get());} catch (InterruptedException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (ExecutionException e) {// TODO Auto-generated catch block
            e.printStackTrace();}}}

转载于:https://www.cnblogs.com/love-Stefanie/p/6729346.html

Java多线程学习笔记(三)——Future和FutureTask相关推荐

  1. Java多线程学习笔记(三)休眠(sleep),让步(yield),插队(join)

    线程目录 线程休眠: 线程让步: 线程插队: 线程休眠: 使用Thread.sleep(long millis)可以使线程休眠,也就是将正在执行的线程暂停,将CPU让给其他线程去执行. 实例: pub ...

  2. java线程集合点_Java多线程学习笔记(三) 甚欢篇

    使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...

  3. java多线程学习笔记。

    java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...

  4. Java 多线程学习笔记(狂神)

    学习视频参考链接:https://www.bilibili.com/video/BV1V4411p7EF?p=27 线程简介 线程的实现(重点) 线程状态 线程同步(重点) 线程通信问题 高级主题(重 ...

  5. Java 多线程学习笔记

    概念 进程 正在运行的程序,是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源,一个进程包括由操作系统分配的内存空间,包含一个或多个线程 一个进程一直运行,直到所有的非守护线 ...

  6. Java基础学习笔记(三)_Java核心技术(高阶)

    本篇文章的学习资源来自Java学习视频教程:Java核心技术(高阶)_华东师范大学_中国大学MOOC(慕课) 本篇文章的学习笔记即是对Java核心技术课程的总结,也是对自己学习的总结 文章目录 Jav ...

  7. Java多线程学习笔记一

    一.关于多线程 Java中的多线程是一个同时执行多个线程的进程.线程是一个轻量级的子进程,是最小的处理单元.线程使用共享内存区域,不分配单独的内存区域以节省内存.Java多线程多用于游戏.动画方面. ...

  8. Java多线程学习笔记-线程的使用

    Java中创建多线程的三种方法 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程 ------------------------- ...

  9. java多线程学习笔记--一.多线程的基础知识

    需要学习的知识 多线程基础知识讲解 参考索隆和jim的视频,以及自己做的笔记 导读 为了充分利用CPU资源,人们发明了线程和进程 进程 由来:在单核cpu的时期,为了方便操作把一系列的操作的指令写下来 ...

  10. 【JAVA多线程学习笔记】(1)实现线程的方式 线程生命周期 操作线程的方法

    文章目录 两种方式实现线程 继承Thread类 模拟银行叫号的程序 Runnable接口 代码1:(与swing相结合创建gui程序) Thread类的⼏个常⽤⽅法 线程生命周期 操作线程的方法 代码 ...

最新文章

  1. 百度大脑发布企业服务解决方案,将 AI 技术落实到细分领域
  2. 浏览器的工作过程(转)
  3. 用UltraIso刻录XP到U盘安装是不行的
  4. java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解
  5. 从Maven中央仓库网站下载jar包的两种方式,将会伴随java后端开发者的整个职业生涯
  6. Linux中的Docker容器的数据卷
  7. 线段树(区间合并) LA 3989 Ray, Pass me the dishes!
  8. 蓝桥杯2020年第十一届C/C++省赛B组第二题-既约分数
  9. Atitit file cms api jcr1 jcr2 目录 1.1. 么是JSR-170幸运的是,被称为Java内容仓库(Java Content Repository,JCR)的JSR-
  10. 安装破解VS2015(破解使用秘钥)
  11. 三国演义 制作词云 2------python
  12. 软件开发生命周期的五个阶段
  13. 初学数据分析(一)【利用numpy实现矩阵标准化】
  14. 计算机无法打开浏览器,Internet选项打不开怎么办?IE浏览器internet选项无法打开解决方法...
  15. WordPress安装教程(详细)
  16. 笔记本如何解除锁定计算机,笔记本键盘锁住了怎么解锁 有三种方法可以解决...
  17. 初学者须知 常见Web前端开发工具有哪些
  18. html视频顺序播放,三个视频并排显示按顺序播放的效果怎么制作?怎么使同框视频依次播放|视频合成软件...
  19. 为什么中国神仙比较负责任?
  20. ABOV(12) UART

热门文章

  1. 初识dokuwiki
  2. 关于 it行业未来 的个人判断
  3. 数据分类是否一定要求样本均衡
  4. 【小知识】Softmax函数与交叉熵
  5. 自身经历解读:2021 校招算法岗, 劝退还是继续
  6. 【NLP之情感分析】华为云NLP算法专家:全面解读文本情感分析任务
  7. [arXiv18]更快的基于非二叉化自底向上策略的转移系统成分句法分析
  8. pandas—pd.merge通过键来联接数据集
  9. 书单 | 读了这10本书,再也不怕黑客攻击了
  10. 2021年的第一本书,就从这里选