首先在源码中我们知道了,线程池的添加线程,就是添加worker类到map里
然后运行worker里面的run方法,可通过创建线程池的时候,指定worker的容量,也就是线程池大小:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,5,1,TimeUnit.SECONDS,new ArrayBlockingQueue<>(3),Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
从上至下依次是:
核心线程数量
最大线程数量
超时时间
时间单位
阻塞队列
线程工厂
拒绝策略
核心线程指的是在请求不多的时候,只有这么多线程是活的
最大线程指的是线程池的最大容量
在请求很多的时候,核心线程已经满了,并且阻塞队列也满了,就会开启(最大线程数量-核心线程数量)的非核心线程,前提是阻塞队列已经满了。这就是开启非核心线程的前提条件。
超时时间则是:非核心线程空闲下来了,一旦空闲时间达到了这么久,就回收它。
拒绝策略也很有意思:
这次调用如果:阻塞队列满了报错(丢弃)、不报错(丢弃)、谁调用就让它自己执行、尝试获取闲暇的线程池执行。
线程池数量的定义:
使用最大cpu核心数量为最佳。