13.FutureTask异步计算

FutureTask

    1.可取消的异步计算,FutureTask实现了Future的基本方法,提供了start、cancel 操作,可以查询计算是否完成,并且可以获取计算
    的结果。结果只可以计算完成之后去获取,get方法会阻塞当前计算没有完成的线程,一定计算完成则会立即释放。

线程池submit与execute

    1.submit()可以传入参数为实现callable接口的实例,返回future实例对象。
    2.execute()返回void。

  1. package demo2;
  2. import java.util.concurrent.*;
  3. /**
  4. * Created by liudan on 2017/7/31.
  5. */
  6. public class DemoFuture implements Callable<String> {
  7. public String name;
  8. public DemoFuture(String name) {
  9. this.name = name;
  10. }
  11. @Override
  12. public String call() throws Exception {
  13. Thread.sleep(3000);
  14. String r = this.name+" 任务处理 success";
  15. return r;
  16. }
  17. public static void main(String[] args) throws ExecutionException, InterruptedException {
  18. FutureTask<String> futureTask1 = new FutureTask<String>(new DemoFuture("订单1"));
  19. FutureTask<String> futureTask2 = new FutureTask<String>(new DemoFuture("订单2"));
  20. ExecutorService executorService = Executors.newFixedThreadPool(2);
  21. Future future1 = executorService.submit(futureTask1);
  22. Future future2 = executorService.submit(futureTask2);
  23. System.out.println("请求完毕...");
  24. try {
  25. System.out.println("处理中...");
  26. Thread.sleep(2000);
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. System.err.println("over:"+futureTask1.get().toString());
  31. System.err.println("over:"+futureTask2.get().toString());
  32. //futureTask1.get()方法,假如get不到,则一直等待阻塞自己的线程。
  33. executorService.shutdown();
  34. }
  35. }
  36. 输出:
  37. 请求完毕... 处理中... over:订单1 任务处理 success over:订单2 任务处理 success

null

时间: 2024-10-10 09:07:45

13.FutureTask异步计算的相关文章

java异步计算Future的使用(转)

从jdk1.5开始我们可以利用Future来跟踪异步计算的结果.在此之前主线程要想获得工作线程(异步计算线程)的结果是比较麻烦的事情,需要我们进行特殊的程序结构设计,比较繁琐而且容易出错.有了Future我们就可以设计出比较优雅的异步计算程序结构模型:根据分而治之的思想,我们可以把异步计算的线程按照职责分为3类: 1. 异步计算的发起线程(控制线程):负责异步计算任务的分解和发起,把分解好的任务交给异步计算的work线程去执行,发起异步计算后,发起线程可以获得Futrue的集合,从而可以跟踪异步

如何给ExecutorService异步计算设置超时

ExecutorService接口使用submit方法会返回一个Future<V>对象,Future表示异步计算的结果.它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果.计算完成后只能使用get方法来获取结果,如有必要,计算完成前可以阻塞此方法.取消则由cancel方法来执行.还提供了其他方法,以确定任务是正常完成还是被取消了.一旦计算完成,就不能再取消计算.如果为了可取消性而使用Future但又不提供可用的结果,则可以声明Future<?>形式类型.并返回nul

分布式计算之异步计算(Gearman示例)

1.异步计算 分布式计算听起来有点高大上,如果说异步计算,估计了解的人多了.我们在日常的工作和生活中,一般都能遇到或者用到异步计算. 比如年底要做很多的报表,领导把需要的报表安排下来,我和我的团队去做统计.为了不耽误领导的时间,不需要领导站在我们屁股后面亲自督战.对领导来说,这个就是一个简单的异步计算模型了. 我们的团队在统计的时候,数据量很多,系统要运行很久,我们也没必要一直看进度条转圈圈,可以去做一下别的工作,或者吃点零食,这个也是异步计算. 负责统计的系统,也没有必要一直转圈圈,把任务在后

Future和FutureTask实现异步计算

开发Android APP经常会使用AsyncTask框架来异步加载资源或者异步到服务器拉消息,等任务完成后再主动更新结果到UI主线程,AsyncTask框架可以非常方便的获取线程异步执行结果.Java 5之前,Java 并没有提供API用于查询线程是否执行完毕以及如何获取线程执行的结果:Java 5 之后版本提供的并发框架包java.util.concurrent对多线程提供了更多更好的支持,Future接口和FutureTask类是异步执行任务的框架的重要组成部分,为了更清楚的理解,我们还得

gearman(异步计算)学习

Gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调 用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务job Server)C++,各个API实现有各种语言的版本.PHP的Client API与Worker API实现为C扩展,在PHP官方网站有此扩展的中英文文档. 2Gearman架构中的三个角色 client:请求的发起者,工作任务的需求方(可以是C.PHP.Java.Perl.Mysql ud

【Spark深入学习 -13】Spark计算引擎剖析

----本节内容------- 1.遗留问题解答 2.Spark核心概念 2.1 RDD及RDD操作 2.2 Transformation和Action 2.3 Spark程序架构 2.4 Spark on Yarn运行流程 2.5 WordCount执行原理 3.Spark计算引擎原理 3.1 Spark内部原理 3.2 生成逻辑执行图 3.3 生成物理执行图 4.Spark Shuffle解析 4.1 Shuffle 简史 4.2  Spark Shuffle ·Shuffle Write

【九天教您南方cass 9.1】 13 等高线法计算土方量

同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取 在测量空间中. 九天老师的联系方式  点击直接请教九天老师吧! 土方量计算在土方工程中有着重要意义和作用,是工程设计的一个重要组成部分.土方量是竖向规划或调整的一个重要依据,也直接关系到工程造价,所以在计算土方时一定要实事求是.精益求精.符合实际.土方计算是土方测量内业处理中的一个关键环节,常用的方法有DTM法.断面法.方格网法.等高线法,它们各具特色,有着不同

Task_取消异步计算限制操作CancellationTokenSource和异步线程中异常的捕获

why:ThreadPool没有内建机制标记当前线程在什么时候完成,也没有机制在操作完成时获得返回值,因而推出了Task,更精确的管理异步线程. How:通过构造方法的参数TaskCreationOptions控制如何创建任务,具体查看该枚举的枚举值.获取任务执行的结果有Task.Result属性,该属性内部调用wait(),例如WaitAny().WaitAll()等等都可以. 如何取消执行中的任务呢? 实例化CancelletionTokenSource类,把该对象作为参数传给异步方法,在异

13.1 异步工作流

有许多地方需要用到异步操作,比如,使用磁盘.调用 web 服务,或者连接到数据库,异步工作流可能显著提高性能.当应用程序执行异步操作时,很难预测操作什么时候完成.如果不能正确处理异步操作,应用程序就会效率低下,甚至可能停止响应. 要使代码能够执行异步操作,不会阻止调用线程,避免出现问题是必要的,但是,使用当前的技术很难实现.在 F# 中,这极大地简化了,是因为有了异步工作流(asynchronous workflows).在讨论如何使用之前,我们先解释一下问题是什么.