SpringBoot | 使用newWorkStealingPool和CompletableFuture进行并发异步处理

关注wx: CodingTechWork

需求

  一个列表操作需要异步处理每个元素,最终需要将列表各个元素的操作结果统一返回,无需关注该列表中的顺序执行。这个线程池不会保证任务的顺序执行,即为WorkStealing抢占式的工作。

开发模板

线程池配置

@Configuration
public class ThreadPoolConfig {

    @Bean
    public ExecutorService getThreadPool(){
    	//工作抢占式线程池
        return Executors.newWorkStealingPool(20);
    }
}

多线程调用


    /**
     * 线程service
     */
	@Autowired
    private 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 
		... ...
	 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值