使用CompletionService结合ExecutorService批处理任务

CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象。

如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果。为此你可以将每个任务的Future保存进一个集合,然后循环这个集合调用Future的get()取出数据。幸运的是CompletionService帮你做了这件事情。

CompletionService整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执行,然后使用类似于队列中的take和poll方法,在结果完整可用时获得这个结果,像一个打包的Future。

CompletionService的take返回的future是哪个先完成就先返回哪一个,而不是根据提交顺序。

例子:

import java.util.Random;

import java.util.concurrent.Callable;

import java.util.concurrent.CompletionService;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorCompletionService;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class CallableAndFuture {

public static void main(String[] args) {

ExecutorService threadPool = Executors. newFixedThreadPool(10);

CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool);

for (int i = 0; i < 10; i++) {

final int seq = i;

System. out.println("开始提交第" + seq + "个任务");

completionService.submit( new Callable<Integer>() {

@Override

public Integer call() throws Exception {

Thread. sleep(new Random().nextInt(5000));

return seq;

}

});

}

for (int i = 0; i < 10; i++) {

try {

// 取出并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。

Integer seq = completionService.take().get();

System. out.println("第" + seq + "个任务返回");

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

}

}

时间: 2024-11-20 07:38:16

使用CompletionService结合ExecutorService批处理任务的相关文章

使用CompletionService结合ExecutorService批处理调用存储过程任务实例

此实例为java多线程并发调用存储过程实例,只做代码记载,不做详细描述 1.线程池构造初始化类CommonExecutorService.java package com.pupeiyuan.go; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.u

ExecutorService与CompletionService

我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用. 之前我一直习惯自己维护一个list保存submit的callable task所返回的Future对象. 在主线程中遍历这个list并调用Future的get()方法取到Task的返回值. 但是,我在很多地方会看到一些代码通过CompletionService包装ExecutorService,然后调用其take(

Java中ExecutorService和CompletionService区别

我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用. 之前我一直习惯自己维护一个list保存submit的callable task所返回的Future对象. 在主线程中遍历这个list并调用Future的get()方法取到Task的返回值. public class CompletionServiceTest { static class Task implemen

ExecutorService和CompletionService区别

ExecutorService和CompletionService区别: ExecutorService:一直习惯自己维护一个list保存submit的callable task所返回的Future对象.在主线程中遍历这个list并调用Future的get()方法取到Task的返回值. CompletionService:在很多地方会看到一些代码通过CompletionService包装ExecutorService,然后调用其take()方法去取Future对象. 这两者最主要的区别:   在

Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable

一.Exectuor框架简介 Java从1.5版本开始,为简化多线程并发编程,引入全新的并发编程包:java.util.concurrent及其并发编程框架(Executor框架). Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等.他们的关系为 在Executor框架中,使用执行器(Exectuo

Java并发编程系列之二十八:CompletionService

CompletionService简介 CompletionService与ExecutorService类似都可以用来执行线程池的任务,ExecutorService继承了Executor接口,而CompletionService则是一个接口,那么为什么CompletionService不直接继承Executor接口呢?主要是Executor的特性决定的,Executor框架不能完全保证任务执行的异步性,那就是如果需要实现任务(task)的异步性,只要为每个task创建一个线程就实现了任务的异

JAVA并发编程J.U.C学习总结

前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www.cnblogs.com/chenpi/p/5614290.html 本文目录如下,基本上涵盖了J.U.C的主要内容: JSR 166及J.U.C Executor框架(线程池. Callable .Future) AbstractQueuedSynchronizer(AQS框架) Locks & C

Java 并发-任务执行.

首先来看一下,任务的定义: 所谓的任务,就是抽象,离散的工作单位.你可以简单理解为代码级别的 (Runnable接口) 大多数并发应用程序都是围绕着任务进行管理的. 看一小段代码: package com.ivan.concurrent.charpter6; import java.net.ServerSocket; import java.net.Socket; /** * 顺序化的Web Server. * @author root * OS:Ubuntu 9.04 * Date:2010-

Java线程和线程池

一.Java线程 几个概念: 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 线程: 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 多线程:在一个进程中创建多个线程,用多线程只有一个目的,那就是更好的利用cpu的资源,如磁盘IO,网络,计算等. 并行与并发: 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的