CompletionService实现多线程任务

使用CompletionService可以简便的实现多线程执行任务后获取结果汇总。

//定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,5, TimeUnit.SECONDS, new LinkedBlockingDeque<>(1000));

CompletionService<List<MetaColumn>> completionService = new ExecutorCompletionService<>(executor);

定义执行类

public class ColumnContrastSearch implements Callable<List<MyResult>> {

    
    private Long id;
//还可以将业务service层的对象注入使用
    

    public ColumnContrastSearch() {
    }

   

    @Override
    public List<MyResult> call() throws Exception {
        //业务代码
    }
}

将多个执行类放在的集合中,然后执行

List<Future<List<MyResult>>> futureList = new CopyOnWriteArrayList<>();
        for (ColumnContrastSearch search : searchList) {
            Future<List<MyResult>> future = completionService.submit(search);
            futureList.add(future);
        }
long start = System.currentTimeMillis();
while (futureList.size() > 0){
for (Future<List<MyResult>> future : futureList) {
    if (future.isDone()) {
        try {
            List<MyResult> object = future.get(5, TimeUnit.MINUTES);
              list.addAll(object);
              futureList.remove(future);
          } catch (Exception e){
              logger.error(e.getMessage(),e);
              throw  ....
                    }
                }
            }
            //10分钟超时退出
            if(System.currentTimeMillis() - start > 1000 * 60 * 10){
                logger.info("耗时超过10分钟,超时退出");
                break;
            }
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值