多线程处理任务后,继续主线程任务

Posted 文林走

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程处理任务后,继续主线程任务相关的知识,希望对你有一定的参考价值。

业务场景:获取三个表数据,发送至三个接口,响应后删除表数据


1 读取三张表数据

/** * 获取所有表数据 */ private void getAllTableData(String curentTime, JSONArray requestArray) {       List<DeviceStatus> deviceStatusList = getDeviceStatusLists(curentTime);        int deviceStatusListSize = 0;        if (!CollectionUtils.isEmpty(deviceStatusList)) {            JSONObject json = new JSONObject();            json.put("url", deviceStatusUrl);            JSONObject param = new JSONObject();            param.put("list", deviceStatusList);            json.put("data", param);            requestArray.add(json);            deviceStatusListSize = deviceStatusList.size();        }        logger.info("deviceBriefStatusList-size:{}", deviceBriefStatusListSize);        //***另外两张表 }


2 将数据发送到线程里

public void executeScheduleTask() { String curentTime = DateUtils.getNowText(); logger.info("操作时间:{}", curentTime);   /*    数据和请求地址放入到requestArray中   */    JSONArray requestArray = new JSONArray();    getAllTableData(curentTime, requestArray);    if (!CollectionUtils.isEmpty(requestArray)) {        //申明线程池        ExecutorService exc = Executors.newFixedThreadPool(requestArray.size());        //申明数据毁掉处理类List<Future<JSONObject>>        List<Future<JSONObject>> futures = new ArrayList<>();        for (int i = 0; i < requestArray.size(); i++) {            JSONObject json = requestArray.getJSONObject(i);            //申请单个线程执行类            DataHandleRequest call = new DataHandleRequest(json);            //提交单个线程            Future<JSONObject> future = exc.submit(call);            //将每个线程放入线程集合,这里如果任何一个线程的执行结果没有毁掉,线程后都会自动堵塞            futures.add(future);        }        //所有线程执行完毕之后会执行下面的循环,然后通过循环每个线程后执行线程的get()方法,每个线程的执行结果        List<String> succList = new ArrayList<>();        try {            for (Future<JSONObject> future : futures) {                JSONObject json = future.get();                String returnData = json.getString("returnData");                JSONObject valueJson = JSONObject.parseObject(returnData);                if (valueJson.containsKey("code") && "000000".equals(valueJson.getString("code"))) {                    succList.add(valueJson.getString("data"));                }                logger.info("同步调用结果:{}", returnData);            }            exc.shutdown();        } catch (Exception e) {            logger.error("同步数据失败:{}", e);        }        //删除已同步数据表        deleteTable(curentTime, succList);    }      logger.info("同步数据表结束,耗时:cost={}ms", cost); }


3数据发送,创建一个执行线程任务类DataHandleRequest

import com.alibaba.fastjson.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.Callable; @Slf4j public class DataHandleRequest implements Callable<JSONObject> {      private JSONObject paramter;    public DataHandleRequest(JSONObject paramter) {        this.paramter = paramter;        String url = this.paramter.getString("url");        JSONObject param = paramter.getJSONObject("data");        logger.info("url:{}", url);        String respStr = RestTemplateClient.postJson(url,  param);        JSONObject json = JSONObject.parseObject(respStr);        this.paramter.put("returnData", json);    }    @Override    public JSONObject call() throws Exception {        return this.paramter;    } }


以上是关于多线程处理任务后,继续主线程任务的主要内容,如果未能解决你的问题,请参考以下文章

锁系列:共享锁CountDownLatch,实现主线程等待子线程任务完成后,再继续执行。

多线程:到底什么时候该用多线程

多线程:到底什么时候该用多线程

浅谈JS异步(asychrouous)

高性能异步爬虫概述

高性能异步爬虫概述