编辑
2024-10-15
学习记录
00
请注意,本文编写于 170 天前,最后修改于 170 天前,其中某些信息可能已经过时。

目录

CompletionService介绍
CompletionService和CompletableFuture的区别
接口介绍
实际使用

CompletionService介绍

CompletionService 是 Java 中用于管理和获取异步任务结果的一个接口,主要功能如下:

  • 任务管理:提供了一种机制来管理和监控一组异步任务。
  • 结果获取:允许以阻塞或非阻塞的方式获取已完成任务的结果。
  • 队列机制:内部通常使用一个队列来保存已完成的任务,方便按顺序处理结果。

典型实现: ExecutorCompletionService:这是 CompletionService 的一个常见实现,它结合了 Executor 和 CompletionService 的功能,可以提交任务并获取结果。

使用场景: 异步任务处理:适用于需要处理大量异步任务且关注任务完成顺序的应用场景。 结果收集:当需要按顺序收集多个异步任务的结果时非常有用。

CompletionService和CompletableFuture的区别

CompletionService 和 CompletableFuture 都是 Java 中用于处理异步计算的工具,但它们有一些不同之处:

  • CompletionService:主要用于管理一组任务并获取它们的结果。它提供了一个队列来保存已完成的任务,并允许以阻塞或非阻塞的方式获取这些任务的结果。典型实现如 ExecutorCompletionService。
  • CompletableFuture:是一个表示异步计算结果的容器类,支持组合多个异步操作,并提供了丰富的API来处理异步编程中的各种场景。它可以看作是对 Future 接口的扩展,同时集成了 CompletionService 的一些功能。

在实际开发中,根据需求选择合适的工具可以更好地组织异步任务的执行与结果处理。

接口介绍

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 许可协议。转载请注明出处!