线程池的七个参数的理解
一.线程池的模型:银行柜台模型
- 线程池的七大参数分别为:
(1)corePoolSize:线程池中常驻核心线程数(图片是3:这里相当于为绿色的柜台,表示正在上班营业的柜台)
(2)maximumPoolSize:线程池能够容纳同时执行的最大线程数(图片是5:绿色加上黄色的柜台数量,黄色表示正在休息的柜台)
(3)keepAliveTime:多余的空闲线程存活时间(这里没有体现,可以理解为柜员4,5营业以后,如果长时间没有客户到来,4,5柜员就会去休息了)
(4)unit:keepAliveTime的时间单位(秒,分,小时等)
(5)workQueue:任务队列,被提交但尚未执行的任务(座椅等候区)
(6)threadFactory:表示生成线程池中的工作线程的线程工厂
(7)handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何拒绝(客户经理对客人说,今天人流量太多了,去其他网点吧)
- 如果有1~3个客人,那么目前开放的1,2,3,柜台刚刚好可以能够支持业务
- 如果有4~6个客人,那么目前开放的1,2,3,柜台刚刚好可以能够支持三个客户办理业务,剩下的人就在等候区等待
- 如果有7~8个客人,那么目前开放的1,2,3柜台支持三个客户办理业务,三个人在等候区等待,柜台4和5就会被唤醒,来办理业务,但是线程池模型这里客户7,8会插队,不去等候直接办理,来的都是VIP哈
- 如果有9个及以上个客人,除去办理业务的8个人,再来的人就会被拒之门外,handler拒绝策略生效
这里我理解如果有人走掉了,比如客户1办完业务了,这时候客户9来了的话就会被允许进入柜台1办理业务
二.代码测试:
import java.util.concurrent.*;
public class ThreadPoolTest {
public static void main(String[] args) {
//参数表示3个正在办理业务的柜台,两个休息的柜台,休息柜台如果办完业务,一秒钟没人来就回去休息了
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 5, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
for (int i = 0; i < 9; i++) {
//修改这里i表示有多少个柜台在办理业务
threadPool.submit(()->{
System.out.println(Thread.currentThread().getName()+"----->正在办理业务");
});
}
}
}