CompletionService 是 Java 中用于管理和获取异步任务结果的一个接口,主要功能如下:
典型实现: ExecutorCompletionService:这是 CompletionService 的一个常见实现,它结合了 Executor 和 CompletionService 的功能,可以提交任务并获取结果。
使用场景: 异步任务处理:适用于需要处理大量异步任务且关注任务完成顺序的应用场景。 结果收集:当需要按顺序收集多个异步任务的结果时非常有用。
CompletionService 和 CompletableFuture 都是 Java 中用于处理异步计算的工具,但它们有一些不同之处:
在实际开发中,根据需求选择合适的工具可以更好地组织异步任务的执行与结果处理。
CompletionService:
Future poll() 检索并移除的代表未来完成任务以后,或 null如果不存在。
Future poll(long timeout, TimeUnit unit) 检索和删除表示下一个已完成的任务的未来,如果需要的话,在指定的等待时间,如果没有的话,等待。
Future submit(Callable task) 提交一个值返回任务执行,并返回一个表示任务挂起结果的未来。
Future submit(Runnable task, V result) 提交执行一个Runnable任务并返回一个表示该任务的未来。
Future take() 检索和删除表示下一个已完成的任务的未来,等待是否还存在。
Future:
boolean cancel(boolean mayInterruptIfRunning) 试图取消此任务的执行。
V get() 等待,如果需要计算完成,然后检索其结果。
V get(long timeout, TimeUnit unit) 如果需要的话,在大多数给定的计算时间完成,然后检索其结果,如果可用。
boolean isCancelled() 返回 true如果这个任务完成之前取消正常。 boolean isDone() 返回 true如果完成这个任务。
java//创建一个线程池
ExecutorService executor = Executors.newCachedThreadPool();
//ExecutorCompletionService使用线程池
CompletionService<Fault> completionService = new ExecutorCompletionService<>(executor);
//调用completionService
Map<String, List<AlgoFault>> groupMap = handlerFaults.stream().collect(Collectors.groupingBy(AlgoFault::getFaultPosName));
groupMap.forEach((k, v) -> {
Callable<Fault> callTask = () -> {
Fault fault = new Fault();
ByteArrayImageProvider bigImgProvider = getImageProvider(v.get(0).getFaultPosImg());
fault.setBigImg(bigImgProvider);
List<Err> errList = new ArrayList<>();
for (AlgoFault abn : v) {
Err err = new Err();
err.setId(abn.getFaultSn());
err.setCheckTime(DateUtil.format(abn.getCheckTime(), "yyyy年MM月dd日 hh时mm分ss秒"));
err.setVehicleNo(abn.getVehicleNo());
err.setTrainNo(abn.getTrainNo());
err.setPartName(abn.getPartName());
err.setPointName(abn.getPointName());
err.setFaultTypeText(abn.getFaultTypeText());
err.setRefImg(getImageProvider(abn.getFaultRelImg()));
err.setSmallImg(getImageProvider(abn.getFaultImg()));
errList.add(err);
}
fault.setErrList(errList);
return fault;
};
completionService.submit(callTask);
});
//等待获取结果
for (int i = 0; i < groupMap.size(); i++) {
try {
Fault f=completionService.take().get();
faultList.add(f);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
//使用完销毁线程池
executor.shutdown();
本文作者:Weee
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!