我有一个ThreadPoolExecutor,它由一个无界队列(LinkedBlockingQueue)构成,核心和最大池大小设置为cpus(比如4)。
每当我收到RejectedExecutionException时都很棒。执行程序处于运行状态。我的理解是这不应该发生在无限制的队列中。
我无法在调试器中发现这一点以确切地看到发生了什么,但是从ThreadPoolExecutor.execute中看起来像堆栈跟踪,workQueue.offer返回false,所以它跳转到它的位置试图启动新线程。但是poolSize已经处于最大值,因此它会抛出被拒绝的执行异常。
我不太明白这一点。
但是,无论如何,我应该使最大池大小比核心池大小大一点吗?
答案 0 :(得分:2)
LinkedBlockingQueue.offer()
在达到其容量时返回false
。如果未指定容量,则使用Integer.MAX_VALUE
。
添加比池大小更多的任务2147483647时会发生这种情况吗?
答案 1 :(得分:2)