一、为什么要使用线程池
不使用线程池的坏处:
- 频繁的线程创建和销毁会占用更多的CPU和内存
- 频繁的线程创建和销毁会对GC产生比较大的压力
- 线程太多,线程切换带来的开销将不可忽视
- 线程太少,多核CPU得不到充分利用,是一种浪费
使用线程池的优点:
- 降低资源的消耗。线程本身是一种资源,创建和销毁线程会有CPU开销;创建的线程也会占用一定的内存。
- 提高任务执行的响应速度。任务执行时,可以不必等到线程创建完之后再执行。
- 提高线程的可管理性。线程不能无限制地创建,需要进行统一的分配、调优和监控。
二、如何创建线程池
(一)线程池的实现原理
通过上图,可以知道线程池大致的流程:
- 任务提交后,判断核心线程是否已满,如果不是,则创建线程执行任务
- 如果核心满了,判断队列是否已满,如果没满,任务放在队列中等待执行
- 如果队列满了,判断线程池是否已满,如果没满,创建其他线程执行任务,缓解压力
- 如果线程池也满了,任务没地方放,也无法执行,则根据Handler策略进行处理