【发布时间】:2017-12-29 16:03:50
【问题描述】:
我有一个示例代码。
@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 时,threadpoolexecutor 无法将一项任务插入队列。我不明白为什么当我设置 maxSize = 4 时,测试没问题。 它来自文档。
- 如果线程数小于corePoolSize,新建一个 线程运行新任务。
- 如果线程数等于(或大于) corePoolSize,将任务放入队列。
- 如果队列已满,并且线程数小于 maxPoolSize,创建一个新线程来运行任务。
- 如果队列已满,并且线程数大于或 等于 maxPoolSize,拒绝任务。
【问题讨论】:
标签: java java.util.concurrent threadpoolexecutor