`

CompletionService

    博客分类:
  • JAVA
 
阅读更多

CompletionService 将执行服务与类似 Queue 的接口组合,从任务执行中删除任务结果的处理。CompletionService 接口包含用来提交将要执行的任务的 submit() 方法和用来询问下一完成任务的 take()/poll() 方法。

CompletionService 允许应用程序结构化,使用 Producer/Consumer 模式,其中生产者创建任务并提交,消费者请求完成任务的结果并处理这些结果。CompletionService 接口由 ExecutorCompletionService 类实现,该类使用 Executor 处理任务并从CompletionService 导出 submit/poll/take 方法。

下列代码使用 Executor 和 CompletionService 来启动许多“solver”任务,并使用第一个生成非空结果的任务的结果,然后取消其余任务:

void solve(Executor e, Collection<Callable<Result>> solvers) 
    throws InterruptedException {
        CompletionService<Result> ecs = 
            new ExecutorCompletionService<Result>(e);
        int n = solvers.size();
        List<Future<Result>> futures = 
            new ArrayList<Future<Result>>(n);
        Result result = null;
        try {
            for (Callable<Result> s : solvers)
                futures.add(ecs.submit(s));
            for (int i = 0; i < n; ++i) {
                try {
                    Result r = ecs.take().get();
                    if (r != null) {
                        result = r;
                        break;
                    }
                } catch(ExecutionException ignore) {}
            }
        }
        finally {
            for (Future<Result> f : futures)
                f.cancel(true);
        }

        if (result != null)
            use(result);
    }
 

分享到:
评论

相关推荐

    ExecutorService与CompletionService对比详解.docx

    ExecutorService 和 CompletionService 是Java并发处理中的两种工具,它们用于管理和执行多个任务。ExecutorService 是一个接口,它是java.util.concurrent.Executor 接口的扩展,提供了一组方法来管理和控制线程池...

    32 请按到场顺序发言—Completion Service详解.pdf

    `CompletionService`是Java并发编程中的一个重要工具,它在`ExecutorService`的基础上提供了一种更加高效的方式来管理和处理并发任务的完成结果。`ExecutorService`允许我们提交任务(通常是`Runnable`或`Callable`...

    通过多线程任务处理大批量耗时业务并返回结果

    `CompletionService`是另一个关键工具,它扩展了`ExecutorService`的功能,尤其适用于需要在任务完成时立即获取结果的情况。`CompletionService`通过`Future`接口返回每个任务的结果,使得我们可以在任务完成的瞬间...

    基于java开发的NIO+多线程实现聊天室+源码+项目解析(毕业设计&课程设计&项目开发)

    CompletionService log4j+slf4j日志 实现的功能 登录注销 单聊 群聊 客户端提交任务,下载图片并显示 上线下线公告 在线用户记录 批量下载豆瓣电影的图片,并打为压缩包传输给客户端 客户端使用方式: 登录:默认...

    java多线程并发编程例子

    3. **CompletionService**:`CompletionService`提供了一种获取异步任务结果的机制,它基于`ExecutorService`,使得你可以按完成顺序获取结果,而不需要知道任务的原始提交顺序。`TestCompletionService.java`可能...

    java多线程程序设计:Java NIO+多线程实现聊天室

    CompletionService log4j+slf4j日志 实现的功能 登录注销 单聊 群聊 客户端提交任务,下载图片并显示 上线下线公告 在线用户记录 批量下载豆瓣电影的图片,并打为压缩包传输给客户端 客户端使用方式: 登录:默认...

    springboot集成amazon aws s3对象存储sdk(javav2)

    CompletionService&lt;PartETag&gt; completionService = new ExecutorCompletionService(executor); for (int i = 1; i ; i++) { UploadPartResponse response = s3Client.uploadPart(uploadRequestBuilder.part...

    个人总结的深入java多线程开发

    9)已完成任务队列CompletionService 36 10)计时器CountDownLatch 37 11)周期性同步工具CyclicBarrier 38 12)异步计算的结果Future 40 13)安排线程池ScheduledExecutorService 40 五多线程面试题 41 六其他主题 41 1)...

    Java并发编程实战

    6.3.6 示例:使用CompletionService实现页面渲染器 6.3.7 为任务设置时限 6.3.8 示例:旅行预定门户网站 第7章 取消与关闭 第8章 线程池的使用 第9章 图形用户界面应用程序 第三部分 活跃性、性能与测试 第10...

    笔记-6、线程池1

    Java的并发编程框架`java.util.concurrent`包提供了`Executor`接口和相关的实现,包括`ExecutorService`、`CompletionService`等,它们使得并发编程更加简洁高效。`CompletionService`允许获取已完成任务的结果,...

    java并发(二十四)多线程结果组装

    通过`CompletionService.submit(Callable)`提交任务,然后调用`take()`或`poll()`方法来获取最先完成的任务结果,这样可以按照任务完成的顺序组装结果,无需等待所有任务完成。 另外,`CompletableFuture`是Java 8...

    Java 并发编程实战

    6.3.6 示例:使用CompletionService实现页面渲染器 6.3.7 为任务设置时限 6.3.8 示例:旅行预定门户网站 第7章 取消与关闭 第8章 线程池的使用 第9章 图形用户界面应用程序 第三部分 活跃性、性能与测试 第10...

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip

    - CompletionService - log4j+slf4j日志 - 实现的功能 - 登录注销 - 单聊 - 群聊 - 客户端提交任务,下载图片并显示 - 上线下线公告 - 在线用户记录 - 批量下载豆瓣电影的图片,并打为压缩包传输给客户端 ...

    JAVA课程学习笔记.doc

    - `java.util.concurrent.CompletionService`:允许获取执行任务的结果,`ExecutorCompletionService` 是其具体实现,结合了 `ExecutorService` 和 `Future`。 5. 线程池执行原理 线程池的执行过程主要包括任务提交...

    JAVA并发编程实践-线程执行-学习笔记

    CompletionService是一个高级的并发工具,它结合了Executor和BlockingQueue的功能,允许处理已完成的任务,而无需等待所有任务完成。这对于处理大量并发任务并需要及时处理已完成任务的场景非常有用。 为任务设置...

    J.U.C系列线程安全的理论讲解编程开发技术共6页.pdf

    5. **`java.util.concurrent.CompletionService`和`ForkJoinPool`**:前者提供了异步任务的完成服务,后者是基于分治策略的并行计算框架,适用于大规模并行计算。 6. **线程安全的集合**:`ConcurrentHashMap`、`...

    02-4(马士兵)-多线程并发

    7. CompletionService:提供了一个基于ExecutorService的接口,可以获取已经完成的任务,简化了异步处理的流程。 学习“02-4(马士兵)-多线程并发”这个主题,你需要理解这些核心概念,并通过实践加深对并发编程的...

    18.【线程池、Lambda表达式】_java线程_lambda线程池_meantbs3_

    例如,我们可以通过`CompletionService`配合`ExecutorService`,使用Lambda表达式创建的任务,实现任务的分批执行和结果的顺序获取。同时,`Future`和`Callable`接口也可以与Lambda表达式结合,用于处理有返回结果的...

Global site tag (gtag.js) - Google Analytics