没有合适的资源?快使用搜索试试~ 我知道了~
ExecutorService与CompletionService对比详解.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 184 浏览量
2022-07-02
22:03:06
上传
评论
收藏 908KB DOCX 举报
温馨提示
试读
18页
如果 Future 结果没有完成,调用 get() 方法,程序会 阻塞 在那里,直至获取返回结果 先来看第一种实现方式,假设任务 A 由于参数原因,执行时间相对任务 B,C,D 都要长很多,但是按照程序的执行顺序,程序在 get() 任务 A 的执行结果会阻塞在那里,导致任务 B,C,D 的后续任务没办法执行。又因为每个任务执行时间是不固定的, 所以无论怎样调整将任务放到 List 的顺序,都不合适,这就是致命弊端
资源推荐
资源详情
资源评论
ExecutorService VS CompletionService
假设我们有 4 个任务(A, B, C, D)用来执行复杂的计算,每个任务的执行时间随
着输入参数的不同而不同,如果将任务提交到 ExecutorService , 相信你已经
“ ”可以 信手拈来
ExecutorService executorService = Executors.newFixedThreadPool(4);
List<Future> futures = new ArrayList<Future<Integer>>();
futures.add(executorService.submit(A));
futures.add(executorService.submit(B));
futures.add(executorService.submit(C));
futures.add(executorService.submit(D));
// 遍历 Future list,通过 get() 方法获取每个 future 结果
for (Future future:futures) {
Integer result = future.get();
// 其他业务逻辑
}
先直入主题,用 CompletionService 实现同样的场景
ExecutorService executorService = Executors.newFixedThreadPool(4);
// ExecutorCompletionService 是 CompletionService 唯一实现类
CompletionService executorCompletionService= new
ExecutorCompletionService<>(executorService );
List<Future> futures = new ArrayList<Future<Integer>>();
futures.add(executorCompletionService.submit(A));
futures.add(executorCompletionService.submit(B));
futures.add(executorCompletionService.submit(C));
futures.add(executorCompletionService.submit(D));
// 遍历 Future list,通过 get() 方法获取每个 future 结果
for (int i=0; i<futures.size(); i++) {
Integer result = executorCompletionService.take().get();
// 其他业务逻辑
}
两种方式在代码实现上几乎一毛一样,我们曾经说过 JDK 中不会重复造轮子,
如果要造一个新轮子,必定是原有的轮子在某些场景的使用上有致命缺陷
既然新轮子出来了,二者到底有啥不同呢? 在 搞定 CompletableFuture,并发
异步编程和编写串行程序还有什么区别?文中,我们提到了Future get()方
法的致命缺陷:
如果 Future 结果没有完成,调用 get() 方法,程序会阻塞在那
里,直至获取返回结果
先来看第一种实现方式,假设任务 A 由于参数原因,执行时间相对任务 B,C,D
都要长很多,但是按照程序的执行顺序,程序在 get() 任务 A 的执行结果会阻
塞在那里,导致任务 B,C,D 的后续任务没办法执行。又因为每个任务执行时间
是不固定的, 所以无论怎样调整将任务放到 List 的顺序,都不合适,这就是
致命弊端
新轮子自然要解决这个问题,它的设计理念就是哪个任务先执行完成,get() 方
法就会获取到相应的任务结果,这么做的好处是什么呢?来看个图你就瞬间理
解了
剩余17页未读,继续阅读
资源评论
小兔子平安
- 粉丝: 209
- 资源: 1940
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功