1.corePoolSize:线程池中的常驻核心线程数。
(1).在创建了线程池后,当有请求任务来了之后,就会安排池中线程去执行请求任务,近似理解为今日当值线程。
(2). 在线程池中的线程数目达到corePoolSize后,就会把后续到达的任务放到缓存队列中。
2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1。
3.keepAliveTime:多余的空闲线程的存活时间。当前线程池数量超过corePoolSize时,当空闲时间到达keepAliveTime值时,多余空闲线程会被销毁直到剩下corePoolSize个线程为止。
(1).默认情况下:只有当线程池中的线程数大于corePoolSize时keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize。
4.unit:keepAliveTime的单位。
5.workQueue:任务队列,被提交但尚未被执行的任务。
6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般默用即可。
7.handler:拒绝策略,表示当dui队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)。
(1).拒绝策略是什么?等待队列也已经满了,再也塞不下新任务了,同时,线程池中的max线程也达到了,无法继续为新任务服务。这时候我们就需要拒绝策略机制合理的处理这个问题。
手写线程池:
public class MyThreadPoolDemo {
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().availableProcessors());
ExecutorService threadPool = new ThreadPoolExecutor(
2, //corePoolSize
5,//maximumPoolSize
1L,//keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
try
{
//模拟10个用户来办理业务,每个用户就是来自外部的请求线程
for (int i = 1; i <= 10; i++) {
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "\t 办理业务");
});
}
}catch (Exception e){
e.printStackTrace();
}finally{
threadPool.shutdown();
}
}}
运行结果:当10位用户来办理时,会出现异常。如图:因为最大线程数为5,阻塞队列为3,所以只要大于8个用户同时请求,就会抛出异常