相比ExecutorService,CompletionService可以更精确和简便地完成异步任务的执行
CompletionService的一个实现是ExecutorCompletionService,它是Executor和BlockingQueue功能的融合体,Executor完成计算任务,BlockingQueue负责保存异步任务的执行结果。
ExecutorCompletionService:实现了CompletionService,将执行完成的任务放到阻塞队列中,通过take或poll方法来获得执行结果
WorkTask
public class WorkTask implements Callable<String> {
private String name;
public WorkTask(String name) {
this.name = name;
}
@Override
public String call() throws Exception {
//休眠随机时间,观察获取结果的行为。
int sleepTime = new Random().nextInt(1000);
Thread.sleep(sleepTime);
String str = name+" sleept time:"+sleepTime;
System.out.println(str+" finished....");
return str;
}
}
CompletionTest
public class CompletionTest {
private final int POOL_SIZE = 10;
private final int TOTAL_TASK = 10;
// 方法二,通过CompletionService来实现获取线程池中任务的返回结果
public void testByCompletion() throws InterruptedException, ExecutionException {
ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE);
CompletionService<String> service = new ExecutorCompletionService<String>(pool);
// 向里面扔任务
for (int i = 0; i < TOTAL_TASK; i++) {
service.submit(new WorkTask("ExecTask" + i));
}
// 检查线程池任务执行结果
for (int i = 0; i < TOTAL_TASK; i++) {
Future<String> future = service.take();
System.out.println("CompletionService:" + future.get());
}
pool.shutdown();
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletionTest completionTest = new CompletionTest();
completionTest.testByCompletion();
}
}
http://blog.csdn.net/u010081710/article/details/51376297 java 多线程的实现