4.Future和 FutureTask

4.1 Future是Callable的返回结果。

它有三个功能
  • 1.判断任务是否完成
  • 2.能够中断任务
  • 3.能够获取任务返回结果

4.2 FutureTask

FutureTask 实现了RunnableFuture接口,RunnableFuture这个接口又继承自Runnable和Future
因此FutureTask 既可以作为Runnable被线程执行(通过包装Callable对象),又可以作为Future得到Callable返回值。
public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
this.callable = callable;
this.state = NEW; // ensure visibility of callable
} public FutureTask(Runnable runnable, V result) {
this.callable = Executors.callable(runnable, result);
this.state = NEW; // ensure visibility of callable
}
两个构造方法,FutureTask接口是Future的唯一实现类。
实现了Callable的对象
class Task implements Callable<String> {

	@Override
public String call() throws Exception {
TimeUnit.SECONDS.sleep(5);
System.out.println("我睡了5s");
return "success";
}
}
方法1:通过FutureTask包装task,然后使用Thread的方式执行
public static void main(String[] args) throws InterruptedException, ExecutionException {

		Task task = new Task();
/**
* 用FutureTask包装Task对象,然后给thread去执行
*/
FutureTask<String> ft = new FutureTask<String>(task); new Thread(ft).start(); System.out.println("主线程获取运行结果为:"+ft.get());
}
方法2:通过FutureTask包装task,然后使用线程池的方式执行
public static void main(String[] args) throws InterruptedException, ExecutionException {

	ExecutorService executorService = Executors.newCachedThreadPool();

	Task task = new Task();
/**
* 用FutureTask包装Task对象,然后给线程池去执行
*/
FutureTask<String> ft = new FutureTask<String>(task); Future<String> result = executorService.submit(task); executorService.shutdown(); System.out.println("主线程获取运行结果为:"+result.get()); }
方法3:直接使用线程池提交Callable对象
public static void main(String[] args) throws InterruptedException, ExecutionException {

	ExecutorService executorService = Executors.newCachedThreadPool();

	Task task = new Task();

	Future<String> result = executorService.submit(task);

	executorService.shutdown();

	System.out.println("主线程获取运行结果为:"+result.get());

}

总结

Future是一个接口, FutureTask类是Future 的一个实现类,并实现了Runnable,因此FutureTask可以传递到线程对象Thread中新建一个线程执行。所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行。

Java并发案例04---Future和 FutureTask的更多相关文章

  1. java并发--Callable、Future和FutureTask

    在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就 ...

  2. Java 并发编程——Callable+Future+FutureTask

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  3. Java并发编程(04):线程间通信,等待/通知机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.概念简介 1.线程通信 在操作系统中,线程是个独立的个体,但是在线程执行过程中,如果处理同一个业务逻辑,可能会产生资源争抢,导致并发问题, ...

  4. 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition

    img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...

  5. java 并发runable,callable,future,futureTask

    转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html package future_call; import java.util.concurre ...

  6. 【并发编程】Future和FutureTask以及CompletionService

    Future接口 此接口主要用于: 代表异步计算的执行结果: 用于可取消的task:(比使用interrupt实现取消要方便 ) FutureTask类 FutureTask是Future的一个实现类 ...

  7. java多线程之Future和FutureTask

    Executor框架使用Runnable 作为其基本的任务表示形式.Runnable是一种有局限性的抽象,然后可以写入日志,或者共享的数据结构,但是他不能返回一个值. 许多任务实际上都是存在延迟计算的 ...

  8. Java多线程之Future与FutureTask

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561154.html  一:Future 在使用实现Callable创建线程时,call()方法是有返回值的. ...

  9. Java并发案例05---Master-Worker模式

    Master-Worker 模式是常用的并行计算模式.它的核心思想是系统由两类进程协同工作,Master和Worker进程.Master负责接收和分配任务,Worker负责处理子任务.当各个Worke ...

随机推荐

  1. 使用PowerShell创建SSAS Role

    PowerShell, SSAS, Role, DatabasePermission, Cube, Dimension, CubePermission, CubeDimensionCube 在SSAS ...

  2. 仿淘宝头像上传功能(三)——兼容 IE6 浏览器。

    前两篇目录: 仿淘宝头像上传功能(一)——前端篇. 仿淘宝头像上传功能(二)——程序篇. 仿淘宝头像上传功能(三)——兼容 IE6 浏览器 之前的这两篇虽然实现了功能,但不兼容低版本浏览器,而且有些浏 ...

  3. JavaScript迭代

    定义: 指的是按照某种顺序逐个访问列表中的每一项. 迭代在数学中的定义: 在循环的基础上, 每一次循环, 都比上一次更为接近结果. 循环定义:指的是在满足条件的情况下,重复执行同一段代码. 迭代方法: ...

  4. 【转载】2012年七个免费ASP空间分享-支持ASP、ASP.NET的空间

    文章目录 Azure空间 Appharbor 7host空间 Brinkster Jabry空间 总结后的话 这篇免费ASP空间的总结文章本来标题已经拟好了是:2012年十大免费ASP空间分享,但是当 ...

  5. 六:SpringCloud-Config

    十:SpringCloudConfig分布式配置中心 1. 概述 1.1 分布式系统面临的 配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的 ...

  6. Win10系统安装vmware workstation 12后没有桥接网卡怎么办

    原文 vmware workstation是一款虚拟机计算机软件,可以同时运行不同的操作系统,然而有win10系统用户在安装vmware workstation 12之后,却发现网络连接里面没有桥接网 ...

  7. Bash拾遗:变量

    使用引号包裹变量 在<高级Bash脚本编程指南>中的4.1节中有这么个例子: hello="A B C D" echo $hello # A B C D echo &q ...

  8. jquery特效:无缝向上循环滚动列表

    效果呈现 整个列表间隔设定的时间向上移动一个item的高度 html结构: <div class="slide-title"> <span>title1&l ...

  9. css3 常用动画 随笔

    /* animation */.a-bounce,.a-flip,.a-flash,.a-shake,.a-swing,.a-wobble,.a-ring{-webkit-animation:1s e ...

  10. Linux菜鸟简单命令

    想要使用Linux,以下这些命令不可少的哦! 我在工作中经常用到的大多数都是一些文件的查找,和上传下载什么的,没什么技术含量,所以除了自己整理的之外,还有借鉴的别的大神的一些命令,我会在最后标注的\( ...