一、CompletionService的实现类:ExecutorCompletionService
相当于ExecutorService与BlockingQueue的组合,即能够将一组任务的运行结果按结果的先后顺序放入阻
塞队列中,以便逐一取出
二、适用场景:
假定有针对某个问题的一组求解程序,每个求解程序都能返回某种类型的 Result 值,并且您想同时运行
它们,使用方法 use(Result r) 处理返回非 null 值的每个求解程序的返回结果
三、代码示例:
import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CompletionServiceTest { public static void main(String[] args) throws Exception{ //声明任务执行容器 ExecutorService executor=Executors.newCachedThreadPool(); CompletionService<String> ec=new ExecutorCompletionService<String>(executor) ; //初始化任务集合 List<CompletionServiceCallable> cs=new ArrayList<CompletionServiceCallable>(); cs.add(new CompletionServiceCallable()); cs.add(new CompletionServiceCallable()); cs.add(new CompletionServiceCallable()); cs.add(new CompletionServiceCallable()); cs.add(new CompletionServiceCallable()); cs.add(new CompletionServiceCallable()); //提交任务 for(CompletionServiceCallable c :cs){ ec.submit(c); } //获取任务执行的结果 int n=cs.size(); for(int i=0;i<n;i++){ Future<String> r= ec.take(); System.out.println("result:"+r.get()); } //关闭线程池 executor.shutdown(); } }
import java.util.Random; import java.util.concurrent.Callable; public class CompletionServiceCallable implements Callable<String> { @Override public String call() throws Exception { //获取随机数 Random rand = new Random(); int rnd=rand.nextInt(99)+1; Thread.sleep(rnd*10); return "completed:"+rnd; } }
四、运行结果
result:completed:7
result:completed:36
result:completed:74
result:completed:78
result:completed:83
result:completed:99
相关推荐
1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 ...
在"java并发(二十四)多线程结果组装"这个主题中,我们主要探讨的是如何在多线程环境中有效地收集和组合各个线程的执行结果。这种场景常见于分布式计算、大数据处理或者并发任务执行的情况。 首先,我们要理解Java...
1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 ...
Java多线程并发编程是Java开发中的重要领域,特别是在服务器端和高并发应用中不可或缺。`java.util.concurrent`包提供了丰富的工具类,帮助开发者更好地管理线程和优化并发性能。以下将详细介绍标题和描述中涉及的...
总的来说,Java并发编程实践中的任务执行是一个涉及线程调度、线程池管理、任务生命周期控制、结果处理等多个方面的复杂主题。理解和掌握这些概念和技术,能够帮助开发者编写出更加高效、可靠的并发程序。
│ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...
ExecutorService 和 CompletionService 是Java并发处理中的两种工具,它们用于管理和执行多个任务。ExecutorService 是一个接口,它是java.util.concurrent.Executor 接口的扩展,提供了一组方法来管理和控制线程池...
#### 一、Java并发编程基础 - **基础知识:** - **线程基本概念:** Java线程是程序执行流的最小单元,一个线程包含一个程序计数器(PC)、虚拟机栈、本地方法栈、线程私有的工作内存。 - **线程生命周期:** 包括`...
│ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...
Java并发库提供了一系列工具类,如Semaphore(信号量)用于限制同时访问特定资源的线程数量,CountDownLatch(倒计时锁)用于一次性释放多个线程,CyclicBarrier(循环栅栏)让一组线程等待所有线程到达某个点后再...
标题中提到了“java.util.concurrent.uml.pdf”,这表明文件是一份Java并发编程工具包java.util.concurrent的UML(统一建模语言)类结构图的PDF格式文件。UML图能够帮助开发者理解Java并发包中的类、接口及其关系,...
6. **Java并发编程**: 除了多线程,还包括线程池的使用(ExecutorService,ThreadPoolExecutor),并发工具类(如Future, Callable, CompletionService),以及并发设计模式的应用。 7. **Spring框架**: 了解...
### 二、Java并发编程 #### 2.1 Java并发API - **Executor框架**:提供了一种管理线程池的高级接口,简化了线程管理和任务调度的过程。 - **Callable与Future**:Callable接口可以返回结果,而Future则用来获取...
在Java中,Java Util Concurrency (JUC) 工具包提供了强大的并发编程支持,这可能是课程内容的重点。 并发是指系统中存在多个执行单元,这些单元可以在同一时刻或交替进行执行。在单核CPU中,这种“同时”执行是...
有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore
Java线程池是Java并发编程中的重要组成部分,它在处理高并发场景时起着至关重要的作用。本篇学习笔记将深入解析Java线程池的框架、结构、原理以及相关源码,帮助读者全面理解线程池的工作机制。 1. 线程池模块结构 ...
描述中提到的"当监测到线程池中存在空闲线程时则动态向线程池中添加新的任务",这是对Java并发工具类`ExecutorService`的一个应用。`ExecutorService`是Java并发框架`java.util.concurrent`包下的核心接口,它允许...