CompletionService 介绍
接口CompletionService 是以异步的方式一边产生新任务,一边处理完成的任务结果,可以将任务执行和任务处理分离开,使用submit()执行任务,task()取得已完成的任务,并按照任务的时间顺序处理结果。
使用CompletionService 解决Future阻塞的问题
Future take() throws InterruptedException ;方法会先将执行完的任务Future对象返回,这样可以部分优化Future的线程阻塞问题,但是接口中存在没有执行完的任务则cs.take().get()还是会阻塞线程。
public class MyCallable implements Callable<String> {
private String name;
private long sleepValue;
public MyCallable(String name, long sleepValue) {
super();
this.name = name;
this.sleepValue = sleepValue;
}
@Override
public String call() throws Exception {
System.out.println(name);
Thread.sleep(sleepValue);
return "result call "+name;
}
}
public static void main(String[] args) {
MyCallable call1 = new MyCallable("任务1", 4000);
MyCallable call2 = new MyCallable("任务2", 3000);
MyCallable call3 = new MyCallable("任务3", 2000);
List<Callable> list = new ArrayList<Callable>();
list.add(call1);
list.add(call2);
list.add(call3);
ThreadPoolExecutor poll = new ThreadPoolExecutor(5, 7, 5, TimeUnit.SECONDS, new LinkedBlockingDeque());
CompletionService cs = new ExecutorCompletionService(poll);
list.forEach(m -> {
cs.submit(m);
});
try {
for (int i = 0; i < list.size(); i++