做Java也有4年了,原来对于ThreadPoolExecutor的maximumPoolSize一直存在误解。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
假设:corePoolSize=3,maximumPoolSize=5,workQueue的容量为100,有如下调用代码:
for (int i = 0; i < 10;i++){
executorService.execute(new Runnable(){
@Override
public void run() {
System.out.println("1:"+ new Date());
try {
Thread.sleep(1000*3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
原本以为线程池会创建5个线程来执行任务,结果只有3个线程。开始以为任务数比corePoolSize大时就回创建更多的线程,原来任务超过workQueue的容量之后才会创建更多的线程来执行任务。也就是说如果是无界的队列,那么maximumPoolSize是否设置是无所谓的。