转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561154.html 

一:Future

在使用实现Callable创建线程时,call()方法是有返回值的。那么,我们在编程时用什么来代表这个 线程执行后才能返回的未来结果 呢?那就是 Future类型。

顾名思义,Future——未来值,我们用这个未来值来代替编程中需要用到线程结果的地方,然后在实际运行时,通过 future.get() 方法来获取线程的真正运行结果。

Future接口有一个泛型参数,其类型与call()方法的返回值类型要一致,也就是说,Future<V>  只是代表 V类型的未来值 而已,不是真的有值存在,需要用到这个具体的值时,就需用V类型的对象future通过get()获取线程的实际运行结果值。

(注:JDK8中提供了CompletableFuture,用来设置线程的完成时间。Future最令人诟病的就是要等待,要自己去检查任务是否完成了,在Future中,任务完成的时间是不可控的,CompletableFuture解决了这个问题。)

二:FutureTask

FutureTask是一种可以取消的(在线程执行完成之前取消)异步线程,它实现了Runnable接口和Future接口,也就是说:它既可以运行线程,又可以携带返回结果。故:实现runnable创建的线程类、实现callable实现的线程类都可以包装成FutureTask对象进行启动。

FutureTask实现了Future接口,故Future中的get()、isDone()、cancel()方法等都得到了具体实现,所以可以通过futuretask对象获取异步线程的执行结果、查询线程的完成状态、取消线程。

FutureTask实现了Runable接口,所以它可以作为Thread类的构造参数被包装成thread类进行启动,也可以被提交给线程池的excute(futuretask)进行启动。

使用过程:创建runnable实现类对象或callable实现类对象——创建FutureTask对象,把runnable实现类对象或callable实现类对象作为参数

——创建Thread对象把futuretask对象作为参数,然后通过thread对象.start()启动,通过Future<V>类型的list保存异步结果

——或者创建线程池,把futuretask对象作为参数交给excute(futuretask)启动,通过Future<V>类型的list保存异步结果

——之后可以通过线程的isDone()查询线程完成状态,通过 cancel()取消线程,通过future结果的get()获取真正结果。(若在get()前线程调用了cancel(),则会抛出异常

Java多线程之Future与FutureTask的更多相关文章

  1. java多线程之Future和FutureTask

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

  2. JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止

    JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止 背景 当单线程的程序发生一个未捕获的异常时我们可以采用try....catch进行异常的捕获,但是在多线程环境 ...

  3. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

  4. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  5. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  6. java多线程之yield,join,wait,sleep的区别

    Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...

  7. Java多线程之Runnable与Thread

    Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...

  8. java多线程之wait和notify协作,生产者和消费者

    这篇直接贴代码了 package cn.javaBase.study_thread1; class Source { public static int num = 0; //假设这是馒头的数量 } ...

  9. java多线程之Callable、Future和FutureTask

    Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...

随机推荐

  1. spring boot application.properties

    1 <properties> <timestamp>${maven.build.timestamp}</timestamp><maven.build.time ...

  2. 拦截器通过Spring获取工厂类,注入bean对象

    // 这里需要注意一点,我们在拦截器内无法通过SpringBean的方式注入LoggerJPA,我只能通过另外一种形式. /** * 根据传入的类型获取spring管理的对应dao * @param ...

  3. [Web 前端 ] 五大WEB主流浏览器及四大内核

    现在国内常见的浏览器有:IE.Firefox.Safari.Opera.Google Chome.QQ浏览器.搜狗浏览器.百度浏览器.猎豹浏览器.UC浏览器.360浏览器.遨游浏览器.世界之窗浏览器等 ...

  4. IsPostback小结

        这两天一直碰到它,却总是不明白,甚至一开始连回传都不知道是啥..现在终于理解了,分享给大家,当然,如有不妥之处,还请大家不吝指教! 解释     要想明白IsPostback,先来看看下面的这 ...

  5. 创想三维:5款最好用的免费3D建模软件【转】

    虽然网上有需要现成的免费三维模型,但对于许多人而言,3D打印机最吸引他们之处是可以设计创造完全属于自己的模型.问题是,现代专业级CAD软件大多价格高昂,例如Solidworks或Zbrush这样的程序 ...

  6. Pytorch之CrossEntropyLoss() 与 NLLLoss() 的区别

    (三)PyTorch学习笔记——softmax和log_softmax的区别.CrossEntropyLoss() 与 NLLLoss() 的区别.log似然代价函数 pytorch loss fun ...

  7. iOS开发-ViewController的生命周期和切换

    ViewController在App开发中是至关重要的一环,无论是页面的展示和数据之间的交互,ViewController提供了一个框架可以管理和构建App应用.iOS中构建App提供了两种方式一种是 ...

  8. Spring Boot Maven Plugin打包异常及三种解决方法:Unable to find main class

    [背景]spring-boot项目,打包成可执行jar,项目内有两个带有main方法的类并且都使用了@SpringBootApplication注解(或者另一种情形:你有两个main方法并且所在类都没 ...

  9. CSS布局中一个简单的应用BFC的例子

    什么是BFC BFC(Block Formatting Context),简单讲,它是提供了一个独立布局的环境,每个BFC都遵守同一套布局规则.例如,在同一个BFC内,盒子会一个挨着一个的排,相邻盒子 ...

  10. 使用Java语言开发微信公众平台(三)——被关注回复与关键词回复

    在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信可提 ...