記一次執行緒堵塞
阿新 • • 發佈:2019-02-07
程式的主流程是 執行緒池Afetch資料,然後執行緒池 B delete資料
public void init() { final String fetchPoolName = "fetch-pool"; fetchVsearchDataExecutor = new ThreadPoolExecutor(4, threadNum, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20), new NameThreadFactory(fetchPoolName), new ThreadPoolExecutor.DiscardPolicy()); final String deletePoolName = "delete-pool"; deleteVsearchDataExecutor = new ThreadPoolExecutor(4, threadNum, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20), new NameThreadFactory(deletePoolName), new BlockRejectedExecutionHandler<Runnable>(deletePoolName)); }
假如:fetch執行緒很耗時,fetch的執行緒池 的RejectedExecutionHandler handler 使用ThreadPoolExecutor.CallerRunsPolicy()或者類似假如阻塞隊列當前執行緒處理,在同時加入執行緒數 > maximumPoolSize+BlockingQueue.size() 會導致主執行緒堵塞,程式無法執行下去,刪除執行緒無法新增到執行緒池中,刪除執行緒無法執行。這樣就需要考慮fetch執行緒池的阻塞佇列的長度要大於fetch執行緒數,考慮是否要丟棄過多的fetch執行緒,以保證刪除執行緒能夠順利得到執行。