亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java多線程數據生成重復

java多線程數據生成重復

Helenr 2019-01-16 08:54:46
這是我們業務中的一段代碼,主要的邏輯就是將數據根據銀行賬號分組,每一組也就是每個銀行賬號起一個線程處理業務邏輯.現在出現的問題就是有線上小概率生成重復數據,本地測試嘗試還原場景,但是一直不能復現問題. 相關代碼 這是入庫的實體 writeOffDailyReport.也即是這個實體生成的時候重復了. ExecutorService cachedThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2); List<Future> futures = Lists.newArrayList(); for (String value : Sets.newHashSet(multimap.keys())) { futures.add(cachedThreadPool.submit(() -> { Thread thread = Thread.currentThread(); logger.info("開啟一條線程," + ": " + value + ",線程信息: 線程id" + thread.getId() + " 線程名" + thread.getName()); values.add(value); List<WriteOffDailyReport> subList = Lists.newArrayList(); BigDecimal initAmount = BigDecimal.ZERO; BigDecimal finalAmount = BigDecimal.ZERO; BigDecimal bankDifferenceBD = BigDecimal.ZERO; List<AnalysisBankBillVo> analysisBankBillVoList = this.getAnalysisBankBillthrowEx(MyUtils.formatNumber(value), exportDate); WriteOffDailyReport reportFromAnalysisBankBill = this.setValueFromAnalysisBankBill(analysisBankBillVoList); logger.info("開始遍歷銀行賬號: " + value + " 下的所有機構核銷數據"); for (WriteOffData writeOffDataExample : Lists.newArrayList(multimap.get(value))) { logger.info("開始執行 銀行賬號: " + value + "下 機構: " + writeOffDataExample.getOrgName()); WriteOffDailyReport writeOffDailyReport = new WriteOffDailyReport(); writeOffDailyReport.setStatus("00"); this.setValueFromWriteOffData(exportDate, writeOffDataExample, writeOffDailyReport); List<OrgConfig> orgConfigs = this.setValueFromOrgConig(writeOffDailyReport, orgConfigMultimap, writeOffDataExample); this.setValueFromYesterDayReport(exportDate, writeOffDailyReport); initAmount = new BigDecimal(writeOffDailyReport.getBankInitialBalance()); finalAmount = new BigDecimal(writeOffDailyReport.getBankFinalBalance()); bankDifferenceBD = this.computeBankDifference(bankDifferenceBD, writeOffDailyReport); this.computeBusinessIncome(writeOffDailyReport); this.computeBankIncomeOrPayout(writeOffDailyReport, orgConfigs); this.setValueFromReportAnalysisBankBill(reportFromAnalysisBankBill, writeOffDailyReport); subList.add(writeOffDailyReport); logger.info("銀行賬號: " + value + "下 機構: " + writeOffDataExample.getOrgName() + " 完畢!"); } logger.info("將銀行賬號: " + value + " 下差異匯總計算"); bankDifferenceBD = computeBankDifferenceExpand(bankDifferenceBD, reportFromAnalysisBankBill); logger.info("開始匯總插入/更新核銷日報"); for (WriteOffDailyReport dailyReport : subList) { dailyReport.setBankDifference(MyUtils.initValue(initAmount.add(bankDifferenceBD).subtract(finalAmount).toPlainString())); this.sortListFromDailyReport(batchAdd, batchUpdate, dailyReport); } return true; })); } 現在是將多線程去掉在跑,效率有點低.對多線程處理還是不熟悉,望指教.
查看完整描述

1 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

 List<AnalysisBankBillVo> analysisBankBillVoList = this.getAnalysisBankBillthrowEx(MyUtils.formatNumber(value), exportDate);
 WriteOffDailyReport reportFromAnalysisBankBill = this.setValueFromAnalysisBankBill(analysisBankBillVoList);      

應該是這里生成的邏輯問題. 沒看到里邊也不太好說. future是不是必須的如果不是必須的,先把這里去掉,一步一步的排查,,這種使用模式肯定是沒有問題的.

查看完整回答
反對 回復 2019-02-12
  • 1 回答
  • 0 關注
  • 929 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號