标签:
当向Executor提交批处理任务时,并且希望在它们完成后获得结果,如果用FutureTask,你可以循环获取task,并用 future.get()去获取结果,但是如果这个task没有完成,你就得阻塞在这里,这个实效性不高,其实在很多场合,其实你拿第一个任务结果时,此 时结果并没有生成并阻塞,其实在阻塞在第一个任务时,第二个task的任务已经早就完成了,显然这种情况用future task不合适的,效率也不高。* 内存一致性效果:线程中向 CompletionService 提交任务之前的操作 happen-before 该任务执行的操作,后者依次 happen-before 紧跟在从对应 take() 成功返回的操作。
package com.robert.concurrent;
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 CompletionServiceDemo {
public static class Task implements Callable<Integer> {
private int i;
Task(int i) {
this.i = i;
}
@Override
public Integer call() throws Exception {
Thread.sleep(new Random().nextInt(5000));
System.out.println(Thread.currentThread().getName() + " " + i);
return i;
}
}
public void run() {
ExecutorService pool = Executors.newFixedThreadPool(10);
CompletionService<Integer> completionServcie = new ExecutorCompletionService<Integer>(
pool);
try {
for (int i = 0; i < 10; i++) {
completionServcie.submit(new CompletionServiceDemo.Task(i));
}
for (int i = 0; i < 10; i++) {
// take 方法等待下一个结果并返回 Future 对象。
// poll 不等待,有结果就返回一个 Future 对象,否则返回 null。
System.out.println(completionServcie.take().get());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} finally {
pool.shutdown();
}
}
public static void main(String[] args) {
new CompletionServiceDemo().run();
}
}
标签:
原文地址:http://blog.csdn.net/robertcpp/article/details/51527299