• Java多线程之Future与FutureTask


    转载请注明原文地址: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(),则会抛出异常

  • 相关阅读:
    hi35183e增加exfat文件系统的支持(转)
    UDP 单播、广播和多播(转)
    linux系统中,kill -3查看java进程状态无效的解决方法
    js是用什么语言编写实现的
    云海天教程
    Docker下安装MySQL
    如何延长手机的使用寿命时间
    如何延长空调使用寿命?
    Linux 发送邮件
    Linux jstack命令
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6561154.html
Copyright © 2020-2023  润新知