1. 程式人生 > 其它 >for 迴圈返回List,多執行緒速度慢的解決方案

for 迴圈返回List,多執行緒速度慢的解決方案

/**過於耗時必須休眠 否則執行緒長期佔用會發生gc不能及時回收資源,cpu 佔用率也會可能飆高 ***/
            CompletableFuture< Map<String, String>> month = CompletableFuture.supplyAsync(() -> {
                String strDt = year + "-";
                String beginFix = "-01 00:00:00";
                String endFix = "-" + wtfHowManyDays(finalI, year) + " 23:59:59";
                
//下面這條語句執行了0.7s,for迴圈12次就是12*0.7=8.4s,顯然不符合服務端2s的規範,優化一下是2.06s,加了執行緒池1404 try { final Map<String, String> map = structureDataForYear(strDt + finalI + beginFix, strDt + finalI + endFix, String.valueOf(wtfHowManyDays(finalI, year))); map.put("month", String.valueOf(finalI));
//ArrayList是執行緒不安全的容器,不能使用 System.out.println("retList==" + retList); return map; } catch (Exception e) { e.printStackTrace(); } return null; },threadPoolConfig.threadPoolTaskExecutor()).whenComplete((res, excption)
-> { retList.add(res); }); //get 方法會阻塞執行緒,執行速度會慢 // retList.add(month.get()); voidCompletableFuture = CompletableFuture.allOf(month); } voidCompletableFuture.join();

我在優化一個別人留下的爛程式碼時遇到的問題,他的sql使用了多表聯查,一個耗時0.7秒多,使用了for 迴圈執行了12次,總共12*0.7=8.4秒。嚴重不符合服務端返回的要求時間。

我使用了多執行緒處理,但是list 返回結果為null,也就是其他執行緒沒執行完,主執行緒返回了,我使用get 阻塞但是比原來不用多執行緒還耗時9秒多。後來用了allOf 阻塞等待全部結束才返回速度明顯提升。但是也只有2秒多,加了執行緒池

程式設計=成1400毫秒,結果符合規範。