为什么要使用线程池?
线程池有一下优点:
- 线程在是非常宝贵的资源,使用线程池可以重复使用线程,避免频繁的创建和销毁线程所带来的系统损耗。
- 可以根据系统的具体情况调整线程池中的数量,避免创建太多线程将服务器资源耗尽。
创建线程池的参数有哪些?
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler);
- corePoolSize: 核心线程数
- maximumPoolSize: 最大线程数
- keepAliveTime:当总的线程数大于核心线程数时,空闲线程的最大存活时间
- unit:存活时间单位
- workQueue:存放任务的队列
- threadFactory:创建线程时指定的工厂
- handler:超出最大线程数和队列容量的处理策略
线程池的原理是什么?
提交一个任务到线程池中,线程池的处理流程为:
- 如果当前线程数量少于 corePoolSize,则创建线程来执行任务。
- 如果大于 corePoolSize,将任务存放到 workQueue 中。如果 workQueue 已经满了,则进入下个流程。
- 判断当前线程数量是否少于 maximumPoolSize, 如果少于则创建线程来执行任务。如果创建的线程数量已经达到了 maximumPoolSize,则使用用户配置的 RejectedExecutionHandler拒绝策略处理。
那线程池中线程的数量应该如何设置?
设置线程池中线程数量,要根据不同的业务场景来设置。
常见的场景有两种:
- CPU密集型:CPU+1
- IO密集型:CPU核数*2