java利用線程池帶有返回值的方式,大體邏輯批量處理大量數(shù)據(jù),啟用線程池,處理完成后將所有的返回內(nèi)容進(jìn)行組裝拼接
廢話不多說開始看代碼,重點(diǎn)敲黑板:
1.ThreadPoolExecutor 線程池創(chuàng)建
2.CountDownLatch 同步工具類,讓主線程一直等待,直到子線程執(zhí)行完后再執(zhí)行
3.listret 用于接收多線程返回值
方式一
使用線程池
// 創(chuàng)建線程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(coresNumber * 2, coresNumber * 2 + 1, 1000, TimeUnit.MINUTES, new LinkedBlockingDeque<>());
/*創(chuàng)建List用來接收多線程返回的內(nèi)容,泛型里面可以自定義,String或者對象亦或者其他類型*/
List<Map<String, Object>> listret = new ArrayList<>();
// 同步工具類,讓主線程一直等待,直到子線程執(zhí)行完后再執(zhí)行
CountDownLatch downLatch = new CountDownLatch(partition.size());
// 循環(huán)任務(wù)的List
for (List<String> stringList : partition) {
// 啟用開啟多個(gè)線程
executor.execute(new Runnable() {
@Override
public void run() {
try {
// 開始調(diào)用具體業(yè)務(wù)代碼
Map<String, Object> mapRet = pmpTargetPriceService.targetPriceThreadTask(stringList, initiateTaskType, userName);
listret.add(mapRet);
} catch (Exception e) {
logger.error("循環(huán)開啟線多線程報(bào)錯(cuò),調(diào)用下游系統(tǒng)出現(xiàn)錯(cuò)誤,異常:" + e);
} finally {
// 業(yè)務(wù)邏輯處理完畢,計(jì)數(shù)器減一【當(dāng)前線程處理任務(wù)完畢,線程釋放進(jìn)入線程池,等待處理下一個(gè)任務(wù)】
downLatch.countDown();
}
}
});
}
// 主線程需要等待子任務(wù)線程執(zhí)行完,結(jié)果匯總之后,主線程繼續(xù)往下執(zhí)行
try {
downLatch.await();
} catch (Exception e) {
logger.error("等待超時(shí)", e);
throw new RuntimeException("系統(tǒng)處理超時(shí),請稍后再試");
}
// 對返回組裝的list進(jìn)循環(huán)處理業(yè)務(wù)邏輯
for (Map<String, Object> esbResultPlm1 : listret) {
// 從Future對象上獲取任務(wù)的返回值,并輸出到控制臺
// Map esbResultPlm1 = (Map) f.get();
// todo 對我返回的多個(gè)map進(jìn)行拼接
if (esbResultPlm1.get("status").equals("fail")) {
failureNum = (int) esbResultPlm1.get("failureNum");
failureMsg.append(esbResultPlm1.get("msg"));
map.put("msg", failureMsg.toString());
failureNumCount += failureNum;
} else {
successNum = (int) esbResultPlm1.get("successNum");
successMsg.append(esbResultPlm1.get("msg"));
map.put("msg", successMsg.toString());
successNumCount += successNum;
}
}
方法一得到的結(jié)果如下,使用線程池我這里是核數(shù)乘以2是核心線程16,最大17,所以這里最多是16個(gè)線程,而且他是無序的隨機(jī)分配的
方式二
重點(diǎn)不用線程池使用@Async注解,但是策略得有所調(diào)整,大體邏輯比如你待處理的數(shù)據(jù)有100條,你可以將這個(gè)List按10條為一個(gè)新的List,循環(huán)這個(gè)集合,在調(diào)用的實(shí)際方法上加@Async注解,從而實(shí)現(xiàn)多線程加快循環(huán)也是可以的
@Async注意點(diǎn),加了該注解的方法不能再同一個(gè)類,否則無效,其次有可能存在啟動過程@Async UnsatisfiedDependencyException導(dǎo)致 SpringBoot 無法啟動問題解決,我這里是在報(bào)錯(cuò)的類里有注入service或者mapper的注解上加了@Lazy注解就可以
// 將要發(fā)送的集合按10個(gè)一組進(jìn)行重新組裝
List<List<String>> partition = Lists.partition(list, 10);
/*創(chuàng)建List用來接收多線程返回的內(nèi)容,泛型里面可以自定義,String或者對象亦或者其他類型*/
List<Map<String, Object>> listret = new ArrayList<>();
// 循環(huán)任務(wù)的List
for (List<String> stringList : partition) {
// 開始調(diào)用具體業(yè)務(wù)代碼
Map<String, Object> mapRet = pmpTargetPriceService.targetPriceThreadTask(stringList, initiateTaskType, userName);
listret.add(mapRet);
}
// 對返回組裝的list進(jìn)循環(huán)處理業(yè)務(wù)邏輯
for (Map<String, Object> esbResultPlm1 : listret) {
//對返回的內(nèi)容進(jìn)行業(yè)務(wù)處理
}
// 調(diào)用的方法,返回map
@Async
public Map<String, Object> targetPriceThreadTask(List<String> idList, String initiateTaskType, String userName) throws Exception {
//具體的邏輯代碼
Map<String, Object> map = new HashMap();
return map;
}
方法二的執(zhí)行結(jié)果,循環(huán)多少次就啟動了多少個(gè)子線程,所以這里的想法是先將原生數(shù)組按自定義個(gè)進(jìn)行分配,如有200個(gè)任務(wù),分給20個(gè)人,每人10個(gè)大概就是這樣的思路
文章來源:http://www.zghlxwxcb.cn/news/detail-815540.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-815540.html
我的完整代碼僅供參考,里面很多類都是我自己業(yè)務(wù)用到的,大家可以借鑒
public Map<String, Object> initiateTargetPriceTask(PmpTargetPriceDTO pmpTargetPriceDTO) throws Exception {
String userName = SecurityUtils.getUsername();
Map map = new HashMap();
List<String> list = Arrays.asList(pmpTargetPriceDTO.getIds());
// 將要發(fā)送的集合按10個(gè)一組進(jìn)行重新組裝
List<List<String>> partition = Lists.partition(list, 10);
// 創(chuàng)建一個(gè)線程池
// 獲取CPU核數(shù)
int coresNumber = Runtime.getRuntime().availableProcessors();
System.out.println("獲取CPU核數(shù):" + coresNumber);
// 創(chuàng)建線程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(coresNumber * 2, coresNumber * 2 + 1, 1000, TimeUnit.MINUTES, new LinkedBlockingDeque<>());
// 獲取任務(wù)發(fā)起類型字段
String initiateTaskType = pmpTargetPriceDTO.getInitiateTaskType();
/*創(chuàng)建List用來接收多線程返回的內(nèi)容,泛型里面可以自定義,String或者對象亦或者其他類型*/
List<Map<String, Object>> listret = new ArrayList<>();
// 同步工具類,讓主線程一直等待,直到子線程執(zhí)行完后再執(zhí)行
CountDownLatch downLatch = new CountDownLatch(partition.size());
// 循環(huán)任務(wù)的List
for (List<String> stringList : partition) {
// 啟用開啟多個(gè)線程
executor.execute(new Runnable() {
@Override
public void run() {
try {
// 開始調(diào)用具體業(yè)務(wù)代碼
Map<String, Object> mapRet = pmpTargetPriceService.targetPriceThreadTask(stringList, initiateTaskType, userName);
listret.add(mapRet);
} catch (Exception e) {
logger.error("循環(huán)開啟線多線程報(bào)錯(cuò),調(diào)用下游系統(tǒng)出現(xiàn)錯(cuò)誤,異常:" + e);
} finally {
// 業(yè)務(wù)邏輯處理完畢,計(jì)數(shù)器減一【當(dāng)前線程處理任務(wù)完畢,線程釋放進(jìn)入線程池,等待處理下一個(gè)任務(wù)】
downLatch.countDown();
}
}
});
}
// 主線程需要等待子任務(wù)線程執(zhí)行完,結(jié)果匯總之后,主線程繼續(xù)往下執(zhí)行
try {
downLatch.await();
} catch (Exception e) {
logger.error("等待超時(shí)", e);
throw new RuntimeException("系統(tǒng)處理超時(shí),請稍后再試");
}
// 關(guān)閉線程池
executor.shutdown();
// 獲取所有并發(fā)任務(wù)的運(yùn)行結(jié)果
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
int failureNum;
int successNum;
int failureNumCount = 0;
int successNumCount = 0;
for (Map<String, Object> esbResultPlm1 : listret) {
// 從Future對象上獲取任務(wù)的返回值,并輸出到控制臺
// Map esbResultPlm1 = (Map) f.get();
// todo 對我返回的多個(gè)map進(jìn)行拼接
if (esbResultPlm1.get("status").equals("fail")) {
failureNum = (int) esbResultPlm1.get("failureNum");
failureMsg.append(esbResultPlm1.get("msg"));
map.put("msg", failureMsg.toString());
failureNumCount += failureNum;
} else {
successNum = (int) esbResultPlm1.get("successNum");
successMsg.append(esbResultPlm1.get("msg"));
map.put("msg", successMsg.toString());
successNumCount += successNum;
}
}
// todo 對最終的結(jié)果進(jìn)行組裝
if (failureNumCount > 0) {
failureMsg.insert(0, "很抱歉,發(fā)起任務(wù)存在失??!共發(fā)起 " + list.size() + "條數(shù)據(jù),其中有" + failureNumCount + " 條數(shù)據(jù)格式不正確,錯(cuò)誤如下:");
map.put("status", "fail");
map.put("msg", failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,數(shù)據(jù)已全部發(fā)起成功!共 " + successNumCount + " 條");
map.put("status", "success");
map.put("msg", successMsg.toString());
}
return map;
}
// 調(diào)用的邏輯處理方法
public Map<String, Object> targetPriceThreadTask(List<String> idList, String initiateTaskType, String userName) throws Exception {
// 發(fā)起目標(biāo)價(jià)任務(wù)
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
StringBuffer NoSubunitmaterialCode = new StringBuffer(); // 子組不存在的物料號合集
StringBuffer NoSubunit = new StringBuffer(); // 沒有子組的子組號合集
Map<String, Object> map = new HashMap();
for (String id : idList) {
PmpTargetPrice pmpTargetPrice = pmpTargetPriceMapper.selectPmpTargetPriceById(id);
SysApiRequestLog sysApiRequestLog = new SysApiRequestLog();
sysApiRequestLog.setRequestMethod("手動發(fā)起目標(biāo)價(jià)任務(wù)");
sysApiRequestLog.setRequestData("物料號:" + pmpTargetPrice.getMaterialCode());
//查詢是否發(fā)起流程,
if (pmpTargetPrice.getIsFqlc().equals("1")) {
failureNum++;
String msg = "<br/>物料號:" + pmpTargetPrice.getMaterialCode() + "、此物料已經(jīng)發(fā)起過流程,請核實(shí)!";
failureMsg.append(msg);
continue;
}
PmpTargetPriceProcess targetPriceProcess = new PmpTargetPriceProcess();
// 請求PLM接口
Map invokeGetPlm = invokeWebService.getInvokeGetPlm(pmpTargetPrice.getMaterialCode());
targetPriceProcess.setSouce("手動發(fā)起"); // 來源(手動發(fā)起)
targetPriceProcess.setTaskSponsor(userName); // 設(shè)置發(fā)起人
targetPriceProcess.setMaterialStatus("0"); // 狀態(tài)
targetPriceProcess.setInitiateTaskType(initiateTaskType); // 設(shè)置手工發(fā)起任務(wù)類型
if (null != invokeGetPlm.get("number").toString()) {
targetPriceProcess.setMaterialCode(invokeGetPlm.get("number").toString()); // 物料編號
}
if (null != invokeGetPlm.get("name").toString()) {
targetPriceProcess.setMaterialName(invokeGetPlm.get("name").toString()); // 物料名稱
}
if (null != invokeGetPlm.get("phase").toString()) {
targetPriceProcess.setStage(invokeGetPlm.get("phase").toString());//階段
}
if (null != invokeGetPlm.get("version").toString()) {
targetPriceProcess.setVersionNo(invokeGetPlm.get("version").toString()); // 大版本
}
if (null != invokeGetPlm.get("state").toString()) {
targetPriceProcess.setMaterialStatus(invokeGetPlm.get("state").toString()); // 狀態(tài)
}
// 請求BOM接口獲取數(shù)據(jù)
Map materialCode = invokeWebService.getEsbBomMaterialInfo(pmpTargetPrice.getMaterialCode());
// 截取物料編碼為子組號
String substring = pmpTargetPriceProcessService.getBlockCode(pmpTargetPrice.getMaterialCode());
PmpTargetRule targetRule = new PmpTargetRule();
PmpTargetRule pmpTargetRule;
String userCode = "";
// 判斷bom是否有返回,有返回表示有路線,無返回表示無路線
if (null != materialCode) {
//根據(jù)物料編號截取的子組取目標(biāo)規(guī)則表PMP_TARGET_RULE中查
targetRule.setSonGroup(substring);
targetRule.setIsRoute("1");
pmpTargetRule = pmpTargetRuleService.selectPmpTargetRuleBySonGroup(targetRule);
// 判斷<pmpTargetRule>子組配置是否存在,如根據(jù)子組查詢不存在則設(shè)置為特殊子組
if (!Optional.ofNullable(pmpTargetRule).isPresent()) {
targetRule.setSonGroup("特殊件無法獲取");
targetRule.setIsRoute("1");
pmpTargetRule = pmpTargetRuleService.selectPmpTargetRuleBySonGroup(targetRule);
}
/**
* 1.一級制造、一級裝配和采購制造均為空時(shí)生成任務(wù);
* 2.一級制造、一級裝配和采購制造均有值時(shí)生成任務(wù);
* 3.一級制造、一級裝配有值,采購制造為空時(shí),不生成任務(wù)。但要判定一級制造和一級裝配均不含CG時(shí)為自制件,
* 不生成任務(wù),但返回PLM為S,提示“一級制造和一級裝配均不含CG,為自制件,不生成任務(wù)”,
* 其他情況返回PLM為E并提示“非自制件,BOM采購制造路線待維護(hù),請稍后發(fā)起定價(jià)任務(wù)”。
*/
String mfmrtg = ""; // 一級制造
String mfartg = ""; // 一級裝配
if (StringUtils.isNotBlank(materialCode.get("MFMRTG").toString())
&& StringUtils.isNotBlank(materialCode.get("MFARTG").toString())
) {
mfmrtg = materialCode.get("MFMRTG").toString(); // 一級制造
mfartg = materialCode.get("MFARTG").toString(); // 一級裝配
} else {
failureNum++;
logger.error("物料號:" + pmpTargetPrice.getMaterialCode() + "獲取BOM信息,一級制造或一級裝配為Null,發(fā)起任務(wù)失?。?);
String msg = "<br/>物料號:" + pmpTargetPrice.getMaterialCode() + "、獲取BOM信息,一級制造或一級裝配為Null,發(fā)起任務(wù)失?。?";
failureMsg.append(msg);
sysApiRequestLog.setResponseStatus(EsbResult.RET_STATUS_ERROR);
sysApiRequestLog.setErrorLog("手動發(fā)起目標(biāo)價(jià)任務(wù),失敗原因:根據(jù)物料號獲取BOM信息,一級制造或一級裝配為Null,發(fā)起任務(wù)失敗");
apiRequestLogService.insertSysApiRequestLog(sysApiRequestLog);
continue;
}
// if (StringUtils.isNotBlank(materialCode.get("MFMRTG").toString())) {
// targetPriceProcess.setOneLevelMake(materialCode.get("MFMRTG").toString()); // 一級制造
// }
// if (StringUtils.isNotBlank(materialCode.get("MFARTG").toString())) {
// targetPriceProcess.setOneLevelAssembling(materialCode.get("MFARTG").toString()); // 一級裝配
// }
targetPriceProcess.setOneLevelMake(mfmrtg); // 一級制造
targetPriceProcess.setOneLevelAssembling(mfartg); // 一級裝配
if (StringUtils.isNotBlank(materialCode.get("CFMRTG").toString())) {
targetPriceProcess.setPurchaseMake(materialCode.get("CFMRTG").toString()); // 采購制造
//根據(jù)BOM接口返回采購制造,如果是PT為研究院,否則為財(cái)務(wù)部
if (targetPriceProcess.getPurchaseMake().equals("PT")) {
if (!StringUtils.isEmpty(pmpTargetRule.getYjyDirectorCode())) {
targetPriceProcess.setTaskPurchase(pmpTargetRule.getYjyDirectorCode()); // 指定填寫目標(biāo)價(jià)人:研究院
// 設(shè)置審核人
String[] splitYjyCode = pmpTargetRule.getYjyDirectorCode().split("/");
userCode = splitYjyCode[0];
} else {
failureNum++;
String msg = "<br/>物料號:" + pmpTargetPrice.getMaterialCode() + "、未獲取到研究院相關(guān)人員,請核對! ";
failureMsg.append(msg);
logger.error("手動發(fā)起目標(biāo)價(jià)任務(wù)-物料號-PT-YJY:" + pmpTargetPrice.getMaterialCode() + "設(shè)置目標(biāo)價(jià)錄入人時(shí)配置有誤,路線為PT,根據(jù)子組查詢但是研究院人員code是未維護(hù)發(fā)起任務(wù)失?。?);
sysApiRequestLog.setResponseStatus(EsbResult.RET_STATUS_ERROR);
sysApiRequestLog.setErrorLog("手動發(fā)起目標(biāo)價(jià)任務(wù)失敗,失敗原因:路線為PT,根據(jù)子組查詢但是研究院人員code是未維護(hù)發(fā)起任務(wù)失敗");
apiRequestLogService.insertSysApiRequestLog(sysApiRequestLog);
NoSubunitmaterialCode.append("物料號-PT-YJY:" + pmpTargetPrice.getMaterialCode() + "/");
NoSubunit.append("子組號-PT-YJY:" + substring + "/");
continue;
}
} else {
if (!StringUtils.isEmpty(pmpTargetRule.getCwDirectorCode())) {
targetPriceProcess.setTaskPurchase(pmpTargetRule.getCwDirectorCode()); // 指定填寫目標(biāo)價(jià)人:財(cái)務(wù)部
// 設(shè)置審核人
String[] splitCwCode = pmpTargetRule.getCwDirectorCode().split("/");
userCode = splitCwCode[0];
} else {
failureNum++;
String msg = "<br/>物料號:" + pmpTargetPrice.getMaterialCode() + "、未獲取到財(cái)務(wù)部相關(guān)人員,請核對! ";
failureMsg.append(msg);
logger.error("手動發(fā)起目標(biāo)價(jià)任務(wù)-物料號-非PT-CW:" + pmpTargetPrice.getMaterialCode() + "設(shè)置目標(biāo)價(jià)錄入人時(shí)配置有誤,路線非PT,根據(jù)子組查詢財(cái)務(wù)人員code是Null發(fā)起任務(wù)失??!");
sysApiRequestLog.setResponseStatus(EsbResult.RET_STATUS_ERROR);
sysApiRequestLog.setErrorLog("手動發(fā)起目標(biāo)價(jià)任務(wù),失敗原因:根據(jù)子組查詢財(cái)務(wù)人員code是Null發(fā)起任務(wù)失敗");
apiRequestLogService.insertSysApiRequestLog(sysApiRequestLog);
NoSubunitmaterialCode.append("物料號-非PT-CW:" + pmpTargetPrice.getMaterialCode() + "/");
NoSubunit.append("子組號-非PT-CW:" + substring + "/");
continue;
}
}
} else {
if (!mfmrtg.equals("CG") || !mfartg.equals("CG")) {
logger.error("物料號:" + pmpTargetPrice.getMaterialCode() + "一級制造和一級裝配均不含CG,為自制件,不生成任務(wù)!");
failureNum++;
String msg = "<br/>物料號:" + pmpTargetPrice.getMaterialCode() + "、一級制造和一級裝配均不含CG,為自制件,不生成任務(wù)! ";
failureMsg.append(msg);
sysApiRequestLog.setResponseStatus(EsbResult.RET_STATUS_ERROR);
sysApiRequestLog.setErrorLog("手動發(fā)起目標(biāo)價(jià)任務(wù),失敗原因:一級制造和一級裝配均不含CG,為自制件,不生成任務(wù)!");
continue;
} else {
failureNum++;
String msg = "<br/>物料號:" + pmpTargetPrice.getMaterialCode() + "、BOM采購制造路線待維護(hù),請稍后發(fā)起定價(jià)任務(wù)!";
failureMsg.append(msg);
sysApiRequestLog.setResponseStatus(EsbResult.RET_STATUS_ERROR);
sysApiRequestLog.setErrorLog("手動發(fā)起目標(biāo)價(jià)任務(wù),失敗原因:BOM采購制造路線待維護(hù),請稍后發(fā)起定價(jià)任務(wù)!");
continue;
}
}
} else {
// 無路線
targetRule.setSonGroup(substring);
targetRule.setIsRoute("0");
pmpTargetRule = pmpTargetRuleService.selectPmpTargetRuleBySonGroup(targetRule);
/**
* 其他特殊件,無法獲取子組,
* PT或無路線由研究院鄭宇處理,
* 非PT的由財(cái)務(wù)部蘇戰(zhàn)波和趙偉處理
*/
if (!Optional.ofNullable(pmpTargetRule).isPresent()) {
targetRule.setSonGroup("特殊件無法獲取");
targetRule.setIsRoute("1");
pmpTargetRule = pmpTargetRuleService.selectPmpTargetRuleBySonGroup(targetRule);
}
if (null != pmpTargetRule && StringUtils.isNotBlank(pmpTargetRule.getYjyDirectorCode())) {
targetPriceProcess.setTaskPurchase(pmpTargetRule.getYjyDirectorCode()); // 指定填寫目標(biāo)價(jià)人:研究院
String[] splitYjyCode = pmpTargetRule.getYjyDirectorCode().split("/");
userCode = splitYjyCode[0];
} else {
failureNum++;
String msg = "<br/>物料號:" + pmpTargetPrice.getMaterialCode() + "、未獲取到研究院相關(guān)人員(無路線),請核對! ";
failureMsg.append(msg);
continue;
}
}
// todo 判斷任務(wù)是研究院或者財(cái)務(wù),設(shè)置審核人
// 查詢研究院,財(cái)務(wù)或者無路線任務(wù)辦理人,并獲取他們的部門編碼,向上尋找審核人
if (!userCode.equals("")) {
SysUser sysUser = userService.selectUserByUserName(userCode);
if (StringUtils.isNotNull(sysUser)) {
// 截取部門code
String deptCode = "";
if (sysUser.getDeptId().length() > 9) {
deptCode = sysUser.getDeptId().substring(0, 9);
} else {
deptCode = sysUser.getDeptId();
}
//查詢審核配置表,查到審核人,插入目標(biāo)價(jià)
PmpTargetAuditConfig pmpTargetAuditConfig = pmpTargetAuditConfigService.selectPmpTargetAuditConfigByDeptCode(deptCode);
targetPriceProcess.setCheckName(pmpTargetAuditConfig.getAuditor());
}
}
//已發(fā)起流程
pmpTargetPrice.setIsFqlc("1");
targetPriceProcess.setStatus("0"); // 任務(wù)狀態(tài) 0待定級發(fā)起
targetPriceProcess.setQuejiaType("目標(biāo)價(jià)"); // 缺價(jià)類型默認(rèn)目標(biāo)價(jià)
//添加任務(wù)發(fā)起人
targetPriceProcess.setTaskSponsor(userName);
targetPriceProcess.setCreateBy(userName);
pmpTargetPriceMapper.updatePmpTargetPrice(pmpTargetPrice);
if (StringUtils.isEmpty(targetPriceProcess.getMaterialName())) {
targetPriceProcess.setMaterialName(pmpTargetPrice.getMaterialName());
}
/**
* 查看當(dāng)前物料號在目標(biāo)價(jià)任務(wù)表中是否存在,最后的檢查
*/
PmpTargetPriceProcess priceProcess = new PmpTargetPriceProcess();
priceProcess.setMaterialCode(targetPriceProcess.getMaterialCode());
priceProcess.setStatus("0,1,2,4");
PmpTargetPriceProcess pmpTargetPriceProcess = targetPriceProcessService.selectPmpTargetPriceProcessByEntity(priceProcess);
if (null != pmpTargetPriceProcess) {
continue;
}
// 設(shè)置任務(wù)號
String newsNo = DateUtils.parseDateToStr("yyyyMMdd", new Date());
int count = targetPriceProcessService.getFindTaskCount();
String format = String.format("%05d", count);
// 任務(wù)編號 MBJRW+年月日+流水號
targetPriceProcess.setTaskNumber("MBJRW" + newsNo + format);
targetPriceProcessService.insertPmpTargetPriceProcess(targetPriceProcess);
successNum++;
}
if (failureNum > 0) {
// failureMsg.insert(0, "很抱歉,發(fā)起任務(wù)存在失??!共 " + failureNum + " 條數(shù)據(jù)格式不正確,錯(cuò)誤如下:");
map.put("status", "fail");
map.put("msg", failureMsg.toString());
map.put("failureNum", failureNum);
} else {
// successMsg.insert(0, "恭喜您,數(shù)據(jù)已全部發(fā)起成功!共 " + successNum + " 條");
map.put("status", "success");
map.put("msg", successMsg.toString());
map.put("successNum", successNum);
}
logger.info("手動發(fā)起目標(biāo)價(jià)任務(wù)結(jié)束!");
logger.info("手動發(fā)起目標(biāo)價(jià)-物料號查找子組有誤的物料統(tǒng)計(jì):" + NoSubunitmaterialCode.toString());
logger.info("手動發(fā)起目標(biāo)價(jià)-物料號查找子組有誤的子組號統(tǒng)計(jì):" + NoSubunit.toString());
return map;
}
總結(jié)方式一和方式二都能解決加快任務(wù)處理,處理時(shí)間都差不讀多,大家可以挑選自己適合的方式,如有更好的方式或不對的點(diǎn)請指正,歡迎大家溝通交流,共同成長進(jìn)步
到了這里,關(guān)于java多線程帶返回值的方式方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!