国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java多線程帶返回值的方式方法

這篇具有很好參考價(jià)值的文章主要介紹了java多線程帶返回值的方式方法。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

java利用線程池帶有返回值的方式,大體邏輯批量處理大量數(shù)據(jù),啟用線程池,處理完成后將所有的返回內(nèi)容進(jìn)行組裝拼接

廢話不多說開始看代碼,重點(diǎn)敲黑板:

1.ThreadPoolExecutor 線程池創(chuàng)建

2.CountDownLatch 同步工具類,讓主線程一直等待,直到子線程執(zhí)行完后再執(zhí)行

java線程創(chuàng)建有返回值的線程,帶返回值,多線程,java,ide,spring boot

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ī)分配的
java線程創(chuàng)建有返回值的線程,帶返回值,多線程,java,ide,spring boot

java線程創(chuàng)建有返回值的線程,帶返回值,多線程,java,ide,spring boot

方式二

重點(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注解就可以

java線程創(chuàng)建有返回值的線程,帶返回值,多線程,java,ide,spring boot

        // 將要發(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è)大概就是這樣的思路

java線程創(chuàng)建有返回值的線程,帶返回值,多線程,java,ide,spring boot

java線程創(chuàng)建有返回值的線程,帶返回值,多線程,java,ide,spring boot文章來源地址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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java多線程 - Java創(chuàng)建線程的4種方式

    Java多線程 - Java創(chuàng)建線程的4種方式

    1. Java創(chuàng)建線程有哪幾種方式? 一個(gè)線程在Java中使用一個(gè)Thread實(shí)例來描述。Thread類是Java語言的一個(gè)重要的基礎(chǔ)類,位于java.lang包中。Thread類有不少非常重要的屬性和方法,用于存儲和操作線程的描述信息。 Thread類的構(gòu)造方法: 1.1 線程創(chuàng)建方法一:繼承Thread類創(chuàng)建線程類 (

    2023年04月08日
    瀏覽(19)
  • Java多線程(1)---多線程認(rèn)識、四種創(chuàng)建方式以及線程狀態(tài)

    Java多線程(1)---多線程認(rèn)識、四種創(chuàng)建方式以及線程狀態(tài)

    目錄 前言 一.Java的多線程 1.1多線程的認(rèn)識? 1.2Java多線程的創(chuàng)建方式 1.3Java多線程的生命周期 1.4Java多線程的執(zhí)行機(jī)制 二.創(chuàng)建多線程的四種方式 2.1繼承Thread類 ?創(chuàng)建線程? ?Thread的構(gòu)造方法和常見屬性 ?2.2.實(shí)現(xiàn)Runnable接口 ?創(chuàng)建線程 ?使用lambda表達(dá)式創(chuàng)建 2.3實(shí)現(xiàn)Callable接口

    2024年02月14日
    瀏覽(23)
  • java創(chuàng)建多線程的七種方式

    一、繼承Thread,重寫run方法 通過自定義一個(gè)類(這里起名為:MyThread),繼承Thread類,重寫run方法,最后在main方法中new出MyThread實(shí)例,調(diào)用這個(gè)實(shí)例的繼承的Thread類的start方法創(chuàng)建一個(gè)線程。 二、實(shí)現(xiàn)Runnable接口,重寫run方法 通過自定義一個(gè)類(這里起名為:MyRunnable)實(shí)現(xiàn)

    2024年02月09日
    瀏覽(25)
  • Java并發(fā)(三)----創(chuàng)建線程的三種方式及查看進(jìn)程線程

    Java并發(fā)(三)----創(chuàng)建線程的三種方式及查看進(jìn)程線程

    例如: 輸出 注意:這里通過 @Slf4j 注解打印的日志 把【線程】和【任務(wù)】(要執(zhí)行的代碼)分開 Thread 代表線程 Runnable 可運(yùn)行的任務(wù)(線程要執(zhí)行的代碼) 例如: 輸出 Java 8 以后可以使用 lambda 精簡代碼 小結(jié) 方法1 是把線程和任務(wù)合并在了一起,方法2 是把線程和任務(wù)分開

    2023年04月24日
    瀏覽(25)
  • java創(chuàng)建多線程的7種方式---代碼詳解

    運(yùn)行結(jié)果如下: 可以看出,主線程是不需要等待子線程執(zhí)行完再執(zhí)行下面的程序,主線程執(zhí)行完了子線程還在執(zhí)行,因此,子線程報(bào)錯(cuò)是不會影響主線程的。 運(yùn)行結(jié)果: 運(yùn)行結(jié)果: 運(yùn)行結(jié)果: callable和future現(xiàn)成可以獲取到返回的結(jié)果,底層是基于LockSupport,從JDK5就提供了C

    2024年02月15日
    瀏覽(17)
  • Java多線程 - 創(chuàng)建的三種方式介紹

    什么是線程 ? 線程(thread)是一個(gè)程序內(nèi)部的一條執(zhí)行路徑。 我們之前啟動程序執(zhí)行后,main方法的執(zhí)行其實(shí)就是一條單獨(dú)的執(zhí)行路徑。 程序中如果只有一條執(zhí)行路徑,那么這個(gè)程序就是單線程的程序。 什么是多線程 ? 多線程是指從軟硬件上實(shí)現(xiàn)多條執(zhí)行流程的技術(shù)。 方式一

    2024年02月20日
    瀏覽(30)
  • 【面試精講】Java線程6種狀態(tài)和工作原理詳解,Java創(chuàng)建線程的4種方式

    【面試精講】Java線程6種狀態(tài)和工作原理詳解,Java創(chuàng)建線程的4種方式

    Java線程6種狀態(tài)和工作原理詳解,Java創(chuàng)建線程的4種方式 一、Java線程的六種狀態(tài) 二、Java線程是如何工作的? 三、BLOCKED 和 WAITING 的區(qū)別 四、start() 和 run() 源碼分析 五、Java創(chuàng)建線程的所有方式和代碼詳解 1. 繼承Thread類 2. 實(shí)現(xiàn)Runnable接口 3. 實(shí)現(xiàn)Callable接口與FutureTask 4. 使用線

    2024年03月13日
    瀏覽(22)
  • java創(chuàng)建線程池一共有七種方式

    這 7 種實(shí)現(xiàn)方法分別是: Executors.newFixedThreadPool:創(chuàng)建一個(gè)固定大小的線程池,可控制并發(fā)的線程數(shù),超出的線程會在隊(duì)列中等待。 Executors.newCachedThreadPool:創(chuàng)建一個(gè)可緩存的線程池,若線程數(shù)超過處理所需,緩存一段時(shí)間后會回收,若線程數(shù)不夠,則新建線程。 Executors.ne

    2024年02月09日
    瀏覽(19)
  • 【Java面試題】線程創(chuàng)建的三種方式及區(qū)別?

    繼承Thread類,子類重寫run()方法,調(diào)用子類的strat()啟動線程。 實(shí)現(xiàn)Runnable接口,實(shí)現(xiàn)run()方法,調(diào)用對象start()啟動線程。 實(shí)現(xiàn)Callable接口,實(shí)現(xiàn)call()方法,用FutureTask()封裝實(shí)現(xiàn)類。使用FutureTask對象作為Thread對象調(diào)用start()啟動線程,調(diào)用FutureTask對象的get()

    2024年02月12日
    瀏覽(25)
  • Java 創(chuàng)建線程的方法

    ??作者簡介:練習(xí)時(shí)長兩年半的Java up主 ??個(gè)人主頁:程序員老茶 ?? ps:點(diǎn)贊??是免費(fèi)的,卻可以讓寫博客的作者開興好久好久?? ??系列專欄:Java全棧,計(jì)算機(jī)系列(火速更新中) ?? 格言:種一棵樹最好的時(shí)間是十年前,其次是現(xiàn)在 ??動動小手,點(diǎn)個(gè)關(guān)注不迷路,感

    2024年02月07日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包