使用ExecutorService、Callable、Future实现有返回结果的多线程 应用实例

  以下是实践中应用到的多线程:

   1、controller代码:


    @RequestMapping(value = "/getTraingingUsersByTrainingIds", method = {RequestMethod.GET, RequestMethod.POST})
    public void getTraingingUsersByTrainingId(@RequestParam(value = "trainingIds", required = true) String trainingIds) {
        try {
            trainingService.getTraingingUsersByTrainingIdsParallel(jsonObject, trainingIds);
        } catch (Exception e) {
            logger.info("根据培训班id获取参培人员失败", e);
        }
    }

2、service类,代码:

//线程池变量定义部分,定义默认是3个线程,且new ThreadFactory()用于自动销毁结束的线程,避免服务器关闭时,这个线程还存在于操作系统里。
//导致服务器端口啥的,仍被占用,不能完全关闭,进而也影响下一次的重启。还得手动杀线程等操作。
private static final ExecutorService threadPool = Executors.newFixedThreadPool(3, new ThreadFactory() {
        public Thread newThread(Runnable r) {
            Thread s = Executors.defaultThreadFactory().newThread(r);
            s.setDaemon(true);
            return s;
        }
    } );

//调用多线程部分的实现方法
public List getTraingingUsersByTrainingIdsParallel(JSONObject jsonObject, String trainingIds) {
        String arrtrainingIds [] = trainingIds.split(",");
          Map<HashMap, Boolean> map = new ConcurrentHashMap<>(); // 用于装载返回值对象,并且能够排重
       
        List<Future> futureList = new ArrayList<>();
        for (String trainingId : arrtrainingIds) {
            Training4ThreadService ytts = new Training4ThreadService(ybsTrainingMapper, map, Integer.parseInt(trainingId));
            Future future = threadPool.submit(ytts);
            futureList.add(future);
        }
        //主线程结束,等待其他线程处理结束时间是30秒,否则报运行时异常
        for(Future future : futureList){
            try {
                future.get(30, TimeUnit.SECONDS);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
//将map的key转换为List,返回
return new ArrayList<>(map.keySet());
    }

3 线程对象类Training4ThreadService的代码如下:

public class Training4ThreadService  implements Runnable{


private List<HashMap> getListUsersByTrainingId(Integer trainingId) {
List<HashMap> ybsUserList = Lists.newArrayList();
Integer iFlag = 0; 
...
if (iFlag == 1) {      
ybsUserList = getYbsTrainingSetPersonSetByTrainingId(trainingId);
} else if(iFlag == 2) { 
Map<String,String> map =  com.beust.jcommander.internal.Maps.newHashMap();
...
map.put("trainingId",trainingId.toString());
ybsUserList = getYbsTrainingSetRangeSetByTrainingId(map);
}
return ybsUserList;
}


@Override
public void run() { //线程里运行入口
List<HashMap>  ybsUserList = getListUsersByTrainingId(trainingId);//业务处理方法,根据实际情况进行定义,处理
//放入到maps
for (HashMap hm :ybsUserList) {
maps.put(hm, true); //放入map里进行,有排重功效
}
}

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值