查看源代碼,您將意識到:
Executors.newFixedThreadPool(threadPoolSize);
相當于:
return new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0L, MILLISECONDS,
new LinkedBlockingQueue());
由于它不提供顯式的RejectedExecutionHandler,因此使用默認的AbortPolicy.一旦隊列滿了,它基本上會拋出RejectedExecutionException.但是隊列是無限的,因此永遠不會滿員.因此,這個執行器接受數量的任務.
你的聲明要復雜得多,而且完全不同:
> new LinkedBlockingQueue< Runnable>(10000)將導致線程池在等待超過10000的任務時丟棄任務.
>我不明白你的RejectedExecutionHandler在做什么.如果池發現它不能再將任何runnables放入隊列,它會調用你的處理程序.在這個處理程序中,你…嘗試將Runnable再次放入隊列(這將在99%的情況下失敗).最后你吞下了這個例外.看起來像ThreadPoolExecutor.DiscardPolicy就是你所追求的.
如果任務隊列太大,看下面的評論似乎是你試圖阻止或以某種方式限制客戶端.我不認為在RejectedExecutionHandler中阻塞是個好主意.而是考慮CallerRunsPolicy拒絕策略.不完全相同,但足夠接近.
總結:如果你想限制掛起任務的數量,你的方法幾乎是好的.如果你想限制并發線程的數量,第一個單線程就足夠了.
1 – 假設2 ^ 31是無窮大