查看源代码,您将意识到:
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是无穷大