多线程处理任务后,继续主线程任务
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; } }
以上是关于多线程处理任务后,继续主线程任务的主要内容,如果未能解决你的问题,请参考以下文章