我有一个示例代码。
@Test
public void testWithBlockQueue() throws InterruptedException {
String poolFormat = "ServiceTaskPool-%d";
int coreSize = 3;
int maxSize = 3;
int queueSize = 1;
int idleThreadLiveInSecond = 35;
ThreadFactory factory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r);
}
};
ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(queueSize);
final ThreadPoolExecutor service = new ThreadPoolExecutor(coreSize, maxSize, idleThreadLiveInSecond,
TimeUnit.SECONDS, queue, factory, new ThreadPoolExecutor.AbortPolicy());
service.allowCoreThreadTimeOut(true);
passTask(coreSize, service);
Thread.sleep(5000);
passTask(coreSize, service);
System.out.printf("Thread pool state %s", service);
Thread.sleep(6000);
}
protected void passTask(int coreSize, ThreadPoolExecutor service) {
for (int i=0; i < coreSize; i++) {
service.execute(new Runnable() {
@Override
public void run() {
System.out.printf("Simple printf from %s \n", Thread.currentThread().getName());
}
});
}
}当我设置queueSize 2时,我得到了异常,因为线程池执行器不能插入一个任务到队列,当我设置queueSize 3是可以的。我不明白为什么当我设置maxSize = 4时,测试是可以的。这是文件上的。
发布于 2017-11-28 15:30:47
实际上,当= 4时,可能会出现异常引发的
第一次打电话给passTask(coreSize, service),我们得到了task1,task2,task3。并将创建thread1、thread2、thread3来运行它们。
第二次调用passTask(coreSize, service)
在3.1条件下,可以抛出异常。但是在测试中,任务会很快地从块队列中取出,因此这种情况几乎不会发生。
P.S.:
当maxSize =3和queueSize =1时,添加以下行
Thread.sleep(10);
之后
for (int i=0; i < coreSize; i++) {
可以使您的代码毫无例外地运行。
https://stackoverflow.com/questions/45274318
复制相似问题