關注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 ... ...}