关注wx: CodingTechWork
需求
一个列表操作需要异步处理每个元素,最终需要将列表各个元素的操作结果统一返回,无需关注该列表中的顺序执行。这个线程池不会保证任务的顺序执行,即为WorkStealing抢占式的工作。
开发模板
线程池配置
@Configuration
public class ThreadPoolConfig {@Beanpublic ExecutorService getThreadPool(){//工作抢占式线程池return Executors.newWorkStealingPool(20);}
}
多线程调用
/*** 线程service*/@Autowiredprivate ExecutorService executorService;/*** 异步处理列表*/private Boolean asynDo(List<String> idList) {List<CompletableFuture<Boolean>> futures = new ArrayList<>();//CompletableFuture 循环处理idList.forEach(id -> {CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(() ->this.setId(id), executorService);//添加到异步汇总结果中futures.add(future);});//校验总的异步结果if (null != futures && !futures.isEmpty()) {//等待所有线程执行完毕futures.forEach(CompletableFuture::join);//处理转发结果for (CompletableFuture<Boolean> completableFuture : futures) {try {Boolean result = completableFuture.get();if (null == result) {log.error("asynDo失败,错误信息:结果为空!");return false;}if (!result) {//一个失败,则都失败return false;} else {//一个成功,则继续log.info("id={}成功", id);}} catch (InterruptedException e) {log.error("asynDo失败,错误信息:{}", e.getMessage());Thread.currentThread().interrupt();return false;} catch (ExecutionException e) {log.error("asynDo失败,错误信息:{}", e.getMessage());return false;}}}return true;}/*** 单个处理*/private Boolean setId(String id) {//TODO ... ...}