newFixedThreadPool.setCorePoolSize() 不使用线程,而是创建新线程。
解释:
我创建了一个大小为 2 的 newFixedThreadPool,如果该池的两个线程都很忙,我会使用 setCorePoolSize() 向该池添加另外两个线程。在此过程中,它似乎没有重用线程,或者可能会终止一些线程并创建新线程,我将用代码解释这一点。
代码:(另请参阅输出以供理解)
public class IncreasePoolSize
{
static ExecutorService service = null;
public static void main(String[] args) throws JMSException, InterruptedException
{
int NoOfth = 2;
int noOfTimesToInc = 0;
System.out.println("Start");
service = Executors.newFixedThreadPool(NoOfth);
for (;;)
{
if ( ((ThreadPoolExecutor)service).getActiveCount() >= NoOfth )
{
if (noOfTimesToInc < 1)
{
System.out.println("Increased Threads-" + (noOfTimesToInc + 1) + " time(s)");
NoOfth += 2;
System.out.println("NoOfTh-" + NoOfth);
((ThreadPoolExecutor)service).setCorePoolSize(NoOfth);
System.out.println("Total no of theads after increasing-" + ((ThreadPoolExecutor)service).getCorePoolSize());
noOfTimesToInc++;
}
}
else if ( ((ThreadPoolExecutor)service).getActiveCount() <= NoOfth)
{
service.execute(new ConcreteThread());
}
}
}
}
class ConcreteThread implements Runnable
{
public void run()
{
try
{
System.out.println("Thread No-" + Thread.currentThread().getId());
Thread.sleep(5000);
System.out.println("Thread No-" + Thread.currentThread().getId() + " finished");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
在输出中可以看到,一旦线程 11 和 12 开始工作,我将数量增加 2,因此线程 13 和 14 开始工作,但之后,我总是创建新线程而不是使用线程 11 和 12 并重用线程 13和 14。
输出:(已在调试模式下运行)
Start
Thread No-11
Thread No-12
Increased Threads-1 time(s)
NoOfTh-4
Total no of theads after increasing-4
Thread No-13
Thread No-14
Thread No-11 finished
Thread No-12 finished
Thread No-13 finished
Thread No-14 finished
Thread No-15
Thread No-16
Thread No-13
Thread No-14
Thread No-15 finished
Thread No-16 finished
Thread No-13 finished
Thread No-14 finished
Thread No-17
Thread No-18
Thread No-13
Thread No-14
Thread No-17 finished
Thread No-18 finished
Thread No-13 finished
Thread No-14 finished
Thread No-19
Thread No-20
Thread No-13
Thread No-14
Thread No-19 finished
Thread No-20 finished
Thread No-13 finished
Thread No-14 finished
Thread No-21
Thread No-22
Thread No-13
Thread No-14
Thread No-21 finished
Thread No-22 finished
Thread No-13 finished
Thread No-14 finished
Thread No-23
Thread No-24
Thread No-13
Thread No-14
您的代码存在的一个问题是您设置了核心池大小,但没有设置最大池大小。 AnewFixedThreadPool
使用相同数量的核心和最大池大小,您在某种程度上违反了该合同。
如果您添加:
service.setMaximumPoolSize(NoOfth);
设置核心池大小后,将按照您的预期重用相同的 4 个线程。
Note: 这实际上是报告的错误 https://bugs.java.com/bugdatabase/view_bug?bug_id=7153400
ThreadPoolExecutor的构造函数和setMaximumPoolSize
如果出现以下情况,则抛出 IllegalArgumentExceptioncorePoolSize > maximumPoolSize
, but setCorePoolSize
才不是。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)