java-多線程池同時執行注意事項

今天線上發現一個bug,雖然程序用了兩個線程池來處理不一樣的任務,可是每次執行批量任務後在數據庫中查詢發現,建立的任務數和線程數對不上,老是隻對應A池中的線程數。B池沒有同時執行。數據庫

可是在測試環境,任務比較少的狀況下,是不存在這種狀況的,看了下代碼,發現問題所在。測試

由於在線程池中使用了ArrayBlockingQueue阻塞隊列,拒絕策略中也使用了executor.getQueue().put(r);阻塞的方法。若是此時,A池中任務很是多,超過了隊列長度,這時添加任務的步驟將阻塞,從而致使後面的B池的代碼沒法執行。線程

針對猜測,進行驗證,將隊列長度設置爲大於任務數後,再運行。發現兩池開始同時工做了。問題解決。隊列

相關文章
相關標籤/搜索