每个变量的作用都已经标明出来了,这里要重点解释一下corePoolSize、maximumPoolSize、largestPoolSize三个变量。
corePoolSize在很多地方被翻译成核心池大小,其实我的理解这个就是线程池的大小。举个简单的例子:
假如有一个工厂,工厂里面有200个工人,每个工人同时只能做一件任务。
因此只要当200个工人中有工人是空闲的,来了任务就分配给空闲的工人做;
当200个工人都有任务在做时,如果还来了任务,就把任务进行排队等待;
如果说新任务数目增长的速度远远大于工人做任务的速度,那么此时工厂主管可能会想补救措施,比如重新招100个临时工人进来;
然后就将任务也分配给这100个临时工人做;
如果说着3000个工人做任务的速度还是不够,此时工厂主管可能就要考虑不再接收新的任务或者抛弃前面的一些任务了。
当这300个工人当中有人空闲时,而新任务增长的速度又比较缓慢,工厂主管可能就考虑辞掉100个临时工了,只保持原来的200个工人,毕竟请额外的工人是要花钱的。
这个例子中的corePoolSize就是200,而maximumPoolSize就是300(200+100)。
也就是说corePoolSize就是线程池大小,maximumPoolSize在我看来是线程池的一种补救措施,即任务量突然过大时的一种补救措施。
不过为了方便理解,在本文后面还是将corePoolSize翻译成核心池大小。
largestPoolSize只是一个用来起记录作用的变量,用来记录线程池中曾经有过的最大线程数目,跟线程池的容量没有任何关系。
代码:
public class TestThread2 {
public static void main(String[] args){
/*
* 第一个参数:corePoolSize。200表示线程池的大小
* 第二个参数:maximumPoolSize,300线程池的最大可容纳的线程数量
*/
ThreadPoolExecutor executor = new ThreadPoolExecutor
(200, 300,10, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(5));
for(int i=0;i<100;i++){
Runnable r = new Runnable(){
@Override
public void run() {
//具体的任务,创建新的客户端连接到服务器
System.out.println("11111111111");
}
};
executor.execute(r);
}
executor.shutdown();
}
}