今天線上發現一個bug,雖然程序用了兩個線程池來處理不一樣的任務,可是每次執行批量任務後在數據庫中查詢發現,建立的任務數和線程數對不上,老是隻對應A池中的線程數。B池沒有同時執行。數據庫
可是在測試環境,任務比較少的狀況下,是不存在這種狀況的,看了下代碼,發現問題所在。測試
由於在線程池中使用了ArrayBlockingQueue阻塞隊列,拒絕策略中也使用了executor.getQueue().put(r);阻塞的方法。若是此時,A池中任務很是多,超過了隊列長度,這時添加任務的步驟將阻塞,從而致使後面的B池的代碼沒法執行。線程
針對猜測,進行驗證,將隊列長度設置爲大於任務數後,再運行。發現兩池開始同時工做了。問題解決。隊列