我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用。

当我们使用ExecutorService来做多线程处理时,习惯自己维护一个list保存submit的callable task所返回的Future对象。

然后在主线程中遍历这个list并调用Future的get()方法取到Task的返回值。

这两者最主要的区别在于submit的task不一定是按照加入自己维护的list顺序完成的。

从list中遍历的每个Future对象并不一定处于完成状态,这时调用get()方法就会被阻塞住,如果系统是设计成每个线程完成后就能根据其结果继续做后面的事,这样对于处于list后面的但是先完成的线程就会增加了额外的等待时间。

比如:浏览器在渲染某个页面时,需要下载很多图片,我们把下载图片放到ExecutorService的tast里面处理,这样我们只能按照放入list的图片顺序来渲染图片,如果有些图片比较大,又比较早的被放入的提交的list<task>,这时候就比较影响用户体验了。

如果我们改用completionService,那就可以通过调用completionService.take(),达到只有有图片下载成功,我们就可以优先渲染(展示)这张图片的目的(我想浏览器应该也是按照逻辑来设计的吧)。

我们来看下CompletionService的一个具体实现的一个具体实现ExecutorCompletionService,

1、private final BlockingQueue<Future<V>> completionQueue; //维护一个阻塞队列

2、protected void done() { completionQueue.add(task); }//当某个task完成的时候,就把该task放入队列中

3、public Future<V> take() throws InterruptedException {

return completionQueue.take();
} //从阻塞队列中拿到已经完成的task

这样整个功能就很清晰了。

转载于:https://www.cnblogs.com/yipihema/p/5549111.html

completionService相关推荐

  1. Java多线程,Thread,Runnable,Callable Task,Future<Task>,CompletionService

    一.Java多线程的方法 1. 继承 Thread 2. 实现 Runnable 3. 实现 Callable 可以有返回值 package com.test;import java.util.Arr ...

  2. 还在使用Future轮询获取结果吗?CompletionService快来了解下。

    背景 二胖上次写完参数校验(<二胖写参数校验的坎坷之路>)之后,领导一直不给他安排其他开发任务,就一直让他看看代码熟悉业务.二胖每天上班除了偶尔跟坐在隔壁的前端小姐姐聊聊天,就是看看这些枯 ...

  3. 学完 CompletionService,可以做时间管理大师?

    作者 | why技术 来源 | why技术(ID:hello_hi_why) 荒腔走板 老规矩,先荒腔走板聊聊其他的. 上面这图是上周六,成都叁缺壹演唱会的现场.正在唱歌的这个男人叫做李志.去年他因为 ...

  4. Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll

    一般情况下,我们使用Runnable作为基本的任务表示形式,但是Runnable是一种有很大局限的抽象,run方法中只能记录日志,打印,或者把数据汇总入某个容器(一方面内存消耗大,另一方面需要控制同步 ...

  5. Java并发编程举例Runnable, Callable, Future, FutureTask, CompletionService

    import java.util.concurrent.*;/*** Created by chenh on 2017/3/23.*/ public class ConcurrentDemo {// ...

  6. java中CompletionService的使用

    java中CompletionService的使用 之前的文章中我们讲到了ExecutorService,通过ExecutorService我们可以提交一个个的task,并且返回Future,然后通过 ...

  7. JDK线程池CompletionService的使用

    最近使用多线程优化了一个非常耗时的ping任务,下面的是未优化的源代码,大致就是遍历es取出的list,然后循环判断是否能ping通: SearchResponse searchResponse = ...

  8. “既生 ExecutorService, 何生 CompletionService?”

    ExecutorService VS CompletionService 假设我们有 4 个任务(A, B, C, D)用来执行复杂的计算,每个任务的执行时间随着输入参数的不同而不同,如果将任务提交到 ...

  9. Java线程之CompletionService批处理任务

    如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...

  10. CompletionService VS ExecutorService

    应用场景: 众所周知,当我们需要并发的执行多个task,可以用ExecutorService来submit, 若需要取得所有task执行结果可以遍历所有的FutureTask中通过FutureTask ...

最新文章

  1. MongoDb在Windows上的下载安装以及可视化工具的下载与使用
  2. java项目嗖嗖移动业务大厅项目报告_晋江市撰写节能评估报告的报告机构立项范本-文瑞...
  3. C# 实验四 获取系统时间、点击加一秒功能
  4. HTML默认样式表CSS属性
  5. 我们是如何通过全球第一免费开源ERP Odoo做到项目100%交付
  6. java动脑公开课_java课堂动手动脑
  7. Zabbix的简单使用
  8. 2只老虎c语言课程设计,中班两只老虎教案
  9. 个人空间岁末大回报活动12月25日获奖名单
  10. Hive架构及相关函数
  11. 新手小白安装Ubuntu18.04后的操作指南
  12. 王道操作系统课代表 - 考研计算机 第一章 计算机概述 究极精华总结笔记
  13. 2019HDU多校第一场 HDU6578 Blank
  14. python泊松分布_常见概率分布的Python实现
  15. 2022年安全员-B证试题及模拟考试
  16. Linux系统编程笔记
  17. 吴恩达获英特尔投资,创业狂人的三家创业公司今何在?
  18. 《小岛经济学》嘟书分享第五期
  19. Android移动开发-调用步行检测和步行计数传感器开发简易计步器的实现
  20. swoole扩展安装使用

热门文章

  1. cdate在java中_Java Calendar.add方法代码示例
  2. 小学期Deadline之GEC6818点奶茶系统
  3. matlab图片包微盘,如何用Matlab绘制二维图形资料下载
  4. mysql 多表并列查询_Mysql多表查询(两张独立表,一张关系表)
  5. php查询sql语句错误,Thinkphp3.2.3在SQL执行错误时查看SQL语句
  6. oracled update_oracle中要谨慎使用update交叉更新!
  7. 笔记︱利用python + flask制作一个简易本地restful API
  8. 主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现
  9. 用Lightroom Classic CC2019 mac合并照片以创建全景和HDR全景
  10. JS常见的字符串操作