文章目录
- 线程池
- 案例
- 参数说明
- 取值策略
线程池
使用一个线程池用于维护线程,可以避免频繁的进行线程创建与销毁造成的浪费。需要使用线程的时候从线程池中取出就可以了。
案例
public class ExecutorDemo {
public static void main(String[] args) {
int corePoolSize = 5;
int maximumPoolSize = 10;
long keepAliveTime = 1000;
TimeUnit unit = TimeUnit.SECONDS;
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingDeque<>());
for (int i = 0; i < 10; i++){
threadPoolExecutor.submit(() -> {
System.out.println(Thread.currentThread().getName() + "正在执行");
});
}
threadPoolExecutor.shutdown();
}
}
一般创建线程池都使用 ThreadPoolExecutor,可以更加灵活的控制参数,灵活的使用线程池。
参数说明
- 核心线程数:corePoolSize,线程池的核心线程数
- 最大线程数:maximumPoolSize,线程池的最大线程数
- 存活时间:keepAliveTime,超过核心线程数小于最大线程数的线程的存活时间
- 时间单位:存活时间的时间单位。
- 堵塞队列:blockedQueue,多余的任务排队
- 拒绝策略:Handler
线程池维护 corePoolSize 的线程,当有超过该线程数的任务时,会被放在堵塞队列中等待,如果任务太多,堵塞队列也满了的话,会判断当前的线程数是否小于最大的线程数,是的话就会继续创建线程。
当执行完成后,大于核心线程数的线程的达到存活时间后,会进行销毁。
取值策略
- 核心线程数:corePoolSize,线程池的核心线程数
I/O 密集型:使用对网络直接的传输,输入输出,对数据库操作等,这个操作可以设置较大的线程池数量。
CPU密集型:计算机应用的类型,为了可以充分的发挥CPU,线程池的数量一般为CPU的核的个数或倍数。
一般的情况下,假如CPU的核心数量为 N ,CPU 密集型可以设置为 N + 1
I/O 密集型可以设置为 N 的倍数.
- 最大线程数:maximumPoolSize,线程池的最大线程数
搭配核心线程数,保持应用使用的线程数不会超出系统的上限。
一般与核心线程池的数量相当。
不过具体的数量,还是要根据实际的业务逻辑,以及测试所得。
- 存活时间:keepAliveTime,超过核心线程数小于最大线程数的线程的存活时间
使用超过核心线程数的存放时间,一般短的任务可以设置较短的存活时间,长的任务设置较长的存放时间。
- 时间单位:存活时间的时间单位。
这个搭配存活时间使用,一般有毫秒,秒,分钟。
-
堵塞队列:多余的任务如何排队有界的阻塞队列一般使用 LinkedBlockQueue。无界的使用 sychronousQueue。
-
拒绝策略:hander,当任务太多可以触发拒绝策略
我是小辉,24 届毕业生。当下是找工作ing,欢迎关注,持续分享。