多线程执行任务,并获取结果
public static void main(String[] args) throws InterruptedException, ExecutionException {
int size = 10;//任务数量
List<Object> resultList = new ArrayList<>();//返回结果
BlockingQueue<Future<Object>> queue = new LinkedBlockingDeque<>(size);
//实例化CompletionService
ExecutorService executorService = Executors.newSingleThreadExecutor();//可以自定义线程池
final CompletionService<Object> completionService = new ExecutorCompletionService<>(
executorService, queue);
// 提交任务
for (int i = 0; i < size; i++) {
completionService.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
//todo 任务执行
return null;
}
});
}
// 输出结果
for (int i = 0; i < size; i++) {
// 获取包含返回结果的future对象(若整个阻塞队列中还没有一条线程返回结果,那么调用take将会被阻塞,
// 当然你可以调用poll,不会被阻塞,若没有结果会返回null,
// poll和take返回正确的结果后会将该结果从队列中删除)
Future<Object> future = completionService.take();
// 从future中取出执行结果,这里存储的future已经拥有执行结果,get不会被阻塞
Object result = future.get();
resultList.add(result);
}
}