加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

FutureTask

发布时间:2020-12-15 06:51:30 所属栏目:Java 来源:网络整理
导读:能异步绝不同步,能并行绝不串行 1.??Future 一个Future代表一个异步计算的结果。Future提供检查计算是否完成、等待计算完成并获取计算结果的方法。只有当计算完成以后,才可以使用get方法检索结果,否则将会阻塞直到计算完成。通过调研cancel方法可以取消执

能异步绝不同步,能并行绝不串行

1.??Future

一个Future代表一个异步计算的结果。Future提供检查计算是否完成、等待计算完成并获取计算结果的方法。只有当计算完成以后,才可以使用get方法检索结果,否则将会阻塞直到计算完成。通过调研cancel方法可以取消执行。另外,还提供了检查任务是正常完成还是被取消的方法。一旦计算完成,这个计算不能被取消。

简单用法:

 1 public class App {
 2     ExecutorService executorService = Executors.newFixedThreadPool(3);
 3     ArchiveSearcher searcher = new ArchiveSearcher();
 4 
 5     void showSearch(final String target) throws InterruptedException  6         Future<String> future executorServicesubmitCallable>()  7             public String call()  8                 return searchersearch( 9             }
10         });
11         
12         displayOtherThings(); // do other things while searching
13         
14         try 15             displayTextfutureget()); // use future
16         } catch ExecutionException ex) { 
17             cleanup(); 
18             return; 
19         20     21 }

FutureTask类是Future的实现,它同时也实现了Runnable,因此也可以被Executor执行。例如,上面的代码可以被改写成如下:

1 FutureTask>(2     3         4     5  6  executorexecute);

2.? FutureTask?

  • 一个可取消的异步计算
  • 该类提供了Future的基本实现,提供了启动和取消计算、查询计算是否完成以及检索计算结果的方法
  • 只有在计算完成后才可检索结果;如果计算尚未完成,get方法将阻塞
  • 计算完成以后,计算不能重启或取消(除非调用runAndReset方法)?

一个FutureTask可以用来包装一个Callable或Runnable对象。因为FutureTask实现了Runnable接口,一个FutureTask可以被提交给一个Executor来执行。?

3.? 示例

1 package comcjsexample; 2 3 import java.util.concurrent.* 5 /** 6 * @author ChengJianSheng 7 * @date 2019-05-22 8 */ 9 10 11 static main[] argsException 12 13 long t1 SystemcurrentTimeMillis14 15 16 17 heatUpWaterFuture 18 @Override 19 () 20 outprintln("烧开水..."21 Threadsleep300022 return "ok"23 24 25 26 27 cookMealsFuture 28 29 30 "煮饭..."31 500032 33 34 35 36 heatUpWaterFuture37 cookMealsFuture38 39 "炒菜..."40 41 200042 43 "菜炒好了了"44 45 if , TimeUnitSECONDS== "ok" 46 && 47 "开饭了..."48 49 50 t2 51 "做饭用时:" + t2-t1+ "ms"52 53 54 }?

输出

1 烧开水...
2 煮饭...
3 炒菜...
4 菜炒好了了
5 开饭了...
6 做饭用时:5014ms?

在实际开发过程中,将那些耗时较长,且可以并行的操作都封装成一个FutureTask(比如:有的数据通过调用dubbo服务获取,有的数据需要从缓存中读取,有的数据需要复杂的计算)?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读