![]() |
1
214
线程池执行器有以下几个关键行为,您的问题可以通过这些行为来解释。 任务提交后,
在第一个示例中,请注意,SynchronousQueue的大小基本上为0。因此,当您达到最大尺寸(3)时,拒绝策略开始(4)。 在第二个示例中,选择的队列是大小不受限制的LinkedBlockingQueue。因此,你会被行为所困扰。 您不能对缓存类型或固定类型进行太多的修补,因为它们的行为几乎是完全确定的。 如果您想要有一个有界的动态线程池,您需要使用一个正的核心大小和最大大小以及一个有限大小的队列。例如,
补遗 :这是一个相当古老的答案,当核心大小为0时,JDK似乎改变了它的行为。由于JDK1.6,如果核心大小为0,并且池中没有任何线程,那么threadpoolExecutor将添加一个线程来执行该任务。因此,核心大小0是上述规则的一个例外。谢谢 Steve 对于 bringing 这引起了我的注意。 |
![]() |
2
57
除非我遗漏了什么,否则原始问题的解决方法很简单。以下代码实现了原始海报所描述的所需行为。它将生成最多5个线程来处理一个无边界队列,空闲线程将在60秒后终止。
|
![]() |
3
7
有同样的问题。 由于没有其他答案能将所有问题结合在一起,因此我将添加我的:
现在写得很清楚了
docs
:如果使用不阻塞的队列(
所以:
执行人有:
|
![]() |
4
6
在第一个示例中,后续任务将被拒绝,因为
听起来您希望缓存线程池带有CallerRunsPolicy。 |
![]() |
5
5
这里的答案都没有解决我的问题,这与使用Apache的HTTP客户端(3.x版本)创建有限数量的HTTP连接有关。由于我花了几个小时才找到一个好的设置,我将分享:
这创造了一个
|
![]() |
6
3
根据JavaDoc for ThreadPool Executor:
(强调我的) 抖动的答案是你想要的,尽管我的答案是你的另一个问题。:) |
![]() |
7
2
还有一个选择。您也可以使用任何其他队列,而不是使用新的SynchronousQueue,但必须确保其大小为1,这样将强制ExecutorService创建新线程。 |
![]() |
8
2
看起来似乎没有任何答案能够真正回答这个问题——事实上,我看不到这样做的方法——即使您从PooledExecutorService子类,因为许多方法/属性都是私有的,例如,使AddingFunderMaximumPoolSize受到保护,您也可以执行以下操作:
我得到的最接近的是这个-但即使这不是一个很好的解决方案
P.S.未进行上述测试 |
![]() |
9
2
这就是你想要的(至少我想是这样)。用于解释检查 Jonathan Feinberg answer
|
![]() |
10
1
这是另一个解决方案。我认为这个解决方案的行为符合您的要求(尽管并不为这个解决方案感到骄傲):
|
![]() |
11
0
默认情况下,并行度级别设置为服务器中CPU核心的数量。如果您有4个核心CPU服务器,线程池大小将为4。此API返回
|
|
user29759326 · 如何返回递归函数中的最后一个值? 4 月前 |
|
malife89 · 将java中的字符串读取为正确的日期格式 4 月前 |
![]() |
Tim · 在java中,有没有更快的方法将字节数组写入文件? 5 月前 |
![]() |
rudraraj · java中未声明最终变量 5 月前 |
![]() |
Bala Ji · 以下BFS的实施效率如何? 5 月前 |