1. 程式人生 > >記一次執行緒堵塞

記一次執行緒堵塞

程式的主流程是 執行緒池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執行緒,以保證刪除執行緒能夠順利得到執行。