executorService多线程实践

做需求时,需要查询出部门一些数据,对这些数据进行业务校验(是否满足订单创建条件),这个业务校验分为三大块,需要走多个查询,如果数据量比较大的时候,这个校验过程会变慢,于是想到使用多线程来校验,下面是代码实践:

    taskDetailList= xxxService.getXxxx();
    if (taskDetailList==null || taskDetailList.size()==0){
           return null;
    }
    final int nThreads = 10;
    final int size = taskDetailList.size();
    ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
    List< Future<DispatchCheckDto>> futures =
        new ArrayList<Future<DispatchCheckDto>>(nThreads);
    try {
       for ( int i = 0; i < size; i++) { 
          final xxxxEntity subEntity = taskDetailList.get(i); 
          Callable<xxxDto> task = new Callable<xxxDto>() { 
                @Override 
                public DispatchCheckDto call() throws Exception { 
                      return checkForThread(subEntity);
               } 
         }; 
          futures.add(executorService.submit(task)); 
       } 

       for ( Future<xxxDto> future : futures) {
            xxxDto fuDto = null;
             try {
                  fuDto = future.get();
                   if(fuDto!= null&&StringUtils.isEmpty(fuDto.getFailReason())){
                        result.add(fuDto);
                  }
            } catch (InterruptedException e) {
                  e.printStackTrace();
            } catch (ExecutionException e) {
                  e.printStackTrace();
            }
      } 
   } finally { 
         executorService.shutdown(); 
   } 
   long endTimde = System. currentTimeMillis();
  LOGGER.info( "使用多线程校验信息耗时:" +(endTimde-startTime)+" ms,校验条数:" +size);

看上面的代码,跟之前的多线程实现不同(之前要实现一个多线程,一般是写一个线程类或者实现runnable接口),executorService是jdk7的新出的封装方法,主要在于Callable里实现具体逻辑,使用executorService.submit(task) 进行线程调度,另外需要注意的是在finally块中要对executorService创造出来的线程shutdown掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值