首页 > 编程语言 >java并发编程之CompletionService(转载)

java并发编程之CompletionService(转载)

时间:2022-09-07 15:22:06浏览次数:59  
标签:cService java CompletionService 编程 Queue Future 线程 ExecutorCompletionService

如果我有一个任务想要异步执行,可以使用CompletableFuture,那如果我有多个任务呢,

想要并发执行或者串行执行,又想要快速拿到异步执行的结果。

那推荐你使用ExecutorCompletionService

CompletionService:可以使得先完成的任务先被取出,减少了不必要的等待时间。
ExecutorCompletionService:CompletionService的唯一实现,内部数据结构加了一个BlockingQueue来保存已经完成的Future对象,只有当这个Future对象状态是结束的时候,才会加入到这个Queue中,take()方法其实就是Producer-Consumer中的Consumer。它会从Queue中取出Future对象,如果Queue是空的,就会阻塞在那里,直到有完成的Future对象加入到Queue中。

// 创建线程池
ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE);
CompletionService<Integer> cService = new ExecutorCompletionService<>(pool);

// 向里面扔任务
for (int i = 0; i < TOTAL_TASK; i++) {
    //这边不是直接通过线程池来提交任务,而是通过CompletionService来提交
    cService.submit(new WorkTask("ExecTask" + i));  
}

// 检查线程池任务执行结果
for (int i = 0; i < TOTAL_TASK; i++) {
     //同样也是从CompletionService来取出结果,因为CompletionService内部实现通过一个BlockingQueue来保存已经完成的结果。
    int sleptTime = cService.take().get();
    System.out.println(" slept "+sleptTime+" ms ...");
    count.addAndGet(sleptTime);
}

 



作者:涣涣虚心0215
链接:https://www.jianshu.com/p/d0c55733c940

标签:cService,java,CompletionService,编程,Queue,Future,线程,ExecutorCompletionService
From: https://www.cnblogs.com/wangbin2188/p/16665579.html

相关文章

  • javascript 过滤字符串中script并且替换掉 xss注入攻击+js调试
    最近发现网上找答案也是80%类似结果。js调试可以在浏览器里,f10,f11可以比较准确。functionscriptReplace(str){if(newRegExp(".*?script[^>]*?.*?(<\/.*?sc......
  • 【JAVA UI】【HarmonyOS】 鸿蒙setBindStateChangedListener的基本使用
    ​ 参数讲解setBindStateChangedListener(Component.BindStateChangedListener)方法说明:该组件是否添加到窗口的组件树上示例findComponentById(ResourceTable.Id_te......
  • Java 基础三、接口与内部类
    1.  在Java程序语言中,接口是对类的一种描述。例如Arrays类中sort方法声明可以对对象进行排序,但前提是对象所属的类必须实现Comparable接口。publicinterfaceComparab......
  • 【FAQ】【JAVA UI】HarmonyOS如何添加创建快捷键
    ​ 【问题描述】HarmonyOS如何添加创建快捷键? 【问题答案】参考资料配置文件说明(Java)config.json配置config.json添加shortcuts标签,代码如下"shortcuts":[......
  • Java实现图片转base64字符串和图片互相转换
    importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;importjava.io.*;/***@Description:*@Author:Han*@CreateDate:2022/9/7**/publicc......
  • java产生一个随机数
    //随机产生8位数StringBuilderstr=newStringBuilder();//定义变长字符串Randomrandom=newRandom();//随机生成数字,并添加到字符串for(inti=0;i<8;i++){str.a......
  • JAVA 几种常见的 ENUM
    方法一:常量在JDK1.5之前,我们定义常量都是:publicstaticfianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法publicen......
  • java学习笔记20
    增强for循环JAVA5引入一种主要用于数组或集合的增强型for循环格式如下for(声明语句:表达式){//代码句子}publicclassForDemo05{  publicstaticvoidmain(Strin......
  • java8新特性:方法引用
    java8新特性:方法引用我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况......
  • Java Servlet 入门: 问题系列:警告: Web应用程序[ROOT]似乎启动了一个名为[Thread-1]的
    问题:在Java 代码中开了一个线程,死循环定时运行。右键运行项目,再右键停目项目: 发现系统有提示警告:警告:Web应用程序[ROOT]似乎启动了一个名为[Thread-1]的线程,但......