线程池的应用

在项目中,应用到了线程池,将代码记录下来,以便将来查看。

1.获取案件信息列表   (controller中的方法  由其他方法调用)

 public List<CaseInfo> getCaseInfoList(JSONArray jsonArray) {
        List<CaseInfo> resultList = new ArrayList<>();
        try {
            // 每30条数据开启一条线程
            int threadSize = 30;
            // 总数据条数
            int dataSize = jsonArray.size();
            // 线程数
            int threadNum = dataSize / threadSize + 1;
            // 定义标记,过滤threadNum为整数
            boolean special = dataSize % threadSize == 0;

            List<Object> jsonList = null;
            //创建线程池
            ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
//定义返回参数   真正的返回的参数类型是  List<CaseInfo> 被Future封装了一层   由于返回的参数不止一个 所以放到list中
            List<Future<List<CaseInfo>>> futures = new ArrayList<>();
//            循环   将数据按照上述要求 以30个为一组放到线程中
            for (int i = 0; i < threadNum; i++) {
                if (i == threadNum - 1) {
                    if (special) {
                        break;
                    }
                    jsonList = jsonArray.subList(threadSize * i, dataSize);
                } else {
                    jsonList = jsonArray.subList(threadSize * i, threadSize * (i + 1));
                }
                final List<Object> objectList = jsonList;
                Callable<List<CaseInfo>> caseInfoCallable = new Callable<List<CaseInfo>>() {
//                    重写call()方法   定义返回类型为List<CaseInfo>
                    @Override
                    public List<CaseInfo> call() {
                        List<CaseInfo> caseInfoList = new ArrayList<>();
                        for (Object object : objectList) {
                            JSONObject jsonObject = JSONObject.parseObject(object.toString());
                            // 返回的案件ID
                            String id = jsonObject.getString("ID");
                            String caseBasis = jsonObject.getString("SIM_COMMON_PROPS");
                            CaseInfo caseInfo = caseInfoService.findCaseInfoById(id);
                            if (null != caseInfo) {
                                caseInfo.setCaseBasis(caseBasis);
                                caseInfoList.add(caseInfo);
                            }
                        }
                        return caseInfoList;
                    }
                };
//                线程提交数据   submit()方法一提交就立刻产生Future类型的返回值,但是刚刚提交的任务可能还在线程池的任务队列中排队
                futures.add(executorService.submit(caseInfoCallable));
            }
            for (Future<List<CaseInfo>> future : futures) {
                List<CaseInfo> caseInfoList = null;
//get()方法取出  Future中的 List<CaseInfo>对象
// 由于submit()的伪返回,所以当任务还在线程池中排队时用get()获取返回值时,get()所在的线程将会阻塞  直到submit提交的任务再线程池中真正执行
                caseInfoList = future.get();
                if (null != caseInfoList && caseInfoList.size() > 0) {
                    resultList.addAll(caseInfoList);
                }
            }
//            关闭线程池
            executorService.shutdown();

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return resultList;
    }

2. 获取单个案件信息(由jsp页面直接调用)

@ResponseBody
    @RequestMapping(value = "caseInfoMessage", method = RequestMethod.POST)
    public TableModel caseInfoMessage(String id, String caseDesc) {
        String url = "";
        String result = "";
        String dictKey = "";
        String predicted = "";
        Future future = null;
        Callable callable = null;
        ExecutorService pool = null;
        TableModel tableModel = new TableModel();
        tableModel.setTotal(0);
        try {
            int taskSize = 3;
//            创建线程池
            pool = Executors.newFixedThreadPool(taskSize);
            // 文本提取
            url = PropertiesUtils.getValue("caseDescTextUrl");
            logger.info(">>>文本提取:" + url);
            if (StringUtils.isNotEmpty(url)) {
                callable = new CaseInfoController(url, caseDesc, 1);
                future = pool.submit(callable);
                result = future.get().toString();
                if (StringUtils.isNotEmpty(result)) {
                    JSONObject fromTextJson = JSONObject.parseObject(result);
                    // 账户
                    String account = fromTextJson.getString("account");
                    if (StringUtils.isNotEmpty(account)) {
                        this.modifyCaseInfo(id, account, 9);
                    }
                    // 电话
                    String phone = fromTextJson.getString("phone");
                    if (StringUtils.isNotEmpty(phone)) {
                        this.modifyCaseInfo(id, phone, 10);
                    }
                    // 网络
                    String network = fromTextJson.getString("network");
                    if (StringUtils.isNotEmpty(network)) {
                        this.modifyCaseInfo(id, network, 11);
                    }
                }
            }
            // 标识提取
            url = PropertiesUtils.getValue("caseDescDictUrl");
            logger.info(">>>标识提取:" + url);
            if (StringUtils.isNotEmpty(url)) {
                // 专案标识
                Map map = new HashMap();
                JSONArray jsonArray = new JSONArray();
                JSONObject jsonObject = new JSONObject();
                callable = new CaseInfoController(url, caseDesc, 2);
                future = pool.submit(callable);
                result = future.get().toString();
                if (StringUtils.isNotEmpty(result)) {
                    map = new HashMap();
                    map.put("root_key", "ZABSDM");
                    jsonArray = JSONArray.parseArray(result);
                    jsonObject = jsonArray.getJSONObject(0);
                    predicted = jsonObject.get("predicted").toString();
                    map.put("dict_value1", predicted);
                    // 专案标识一
                    dictKey = dictService.findDictKeyByMap(map);
                    logger.info(">>>专案标识:"+predicted +",字典:" +dictKey);
                    if (StringUtils.isNotEmpty(dictKey)) {
                        this.modifyCaseInfo(id, dictKey, 5);
                    }
                }
                // 小类标识
                callable = new CaseInfoController(url, caseDesc, 3);
                future = pool.submit(callable);
                result = future.get().toString();
                if (StringUtils.isNotEmpty(result)) {
                    map = new HashMap();
                    map.put("root_key", "AJXLDM");
                    map.put("parent_key", dictKey);
                    jsonArray = JSONArray.parseArray(result);
                    jsonObject = jsonArray.getJSONObject(0);
                    predicted = jsonObject.get("predicted").toString();
                    map.put("dict_value1", predicted);
                    dictKey = dictService.findDictKeyByMap(map);
                    logger.info(">>>小类标识:"+predicted +",字典:" +dictKey);
                    // 小类标识一
                    if (StringUtils.isNotEmpty(dictKey)) {
                        this.modifyCaseInfo(id, dictKey, 6);
                    }
                }
            }
            tableModel = caseInfoService.findCaseInfListById(id);
        } catch (Exception e) {
            logger.error("自动提取服务异常" + e.getMessage());
            throw new DzptWebLayerException("自动提取服务异常", e);
        } finally {
            // 关闭线程池
            if (null != pool) {
                pool.shutdown();
            }
        }
        return tableModel;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值