JAVA线程池的自定义
代码
public class ThreadPool {
public static void main(String[] args) {
ThreadPoolExecutor pool = new ThreadPoolExecutor( 2,
5,
3,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
try {
for (int i = 0; i < 5; i++) {
pool.execute(()->{
System.out.println(Thread.currentThread().getName()+"ok");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.shutdown();
}
}
}
讲解
- 线程池参数众多,大多数人都是不寒而栗,接下来这些将会帮助你理解
new ThreadPoolExecutor( 2,
5,
3,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
- 将线程池比作银行
- @Param1:核心线程数-----------银行平常开放的业务窗口,人少时估计就1-2个窗口
- @Param2:最大线程数-----------
银行总共的业务窗口数
- @Param3:保持时间--------------银行高峰期会加窗口处理业务,处理到后面人少了,银行等待一定时间看办理业务的人是否还会剧增,如不会剧增就会撤销多余窗口,这个等待时间就是保持时间
- @Param4:时间的单位-----------
分秒时
- @Param5:阻塞队列--------------银行的等候区,先来先处理业务。这里可以想象平常窗口数为2,加上等待区3个位置,如果来办理业务的人超过他们的和5,就需要增加窗口,这里最多窗口数为5,等待区为3,故最多能容纳8个人处理业务,多的人就在银行门外侯着,或者叫他们明天再来,这是需要一个拒绝策略
- @Param6:线程工厂--------------
生成线程
- @Param7:拒绝策略--------------上述提到拒绝策略