线程池的类型
① FixedThreadPool
线程数固定的线程池
线程池参数:
- 核心线程数和最大线程数一致
- 非核心线程线程空闲存活时间,即keepA1iveTime为0
- 阳塞队列为无界队列 LinkedBlockingQueue
工作机制:
- 提交线程任务
- 如果线程数少于核心线程,创建核心线程执行任务
- 如果线程数等于核心线程,把任务添加到 LinkedBlockingQueue 阻塞队列
- 如果线程执行完任务,去阻塞队列取任务,继续执行
使用场景:适用于处理 CPU 密集型的任务,确保 CPU 在长期被工作线程使用的情况下,尽可能的少的分配线程,即适用执行长期的任务。
② CachedThreadPool
可缓存线程池,线程数根据任务动态调整的线程池
线程池参数:
- 核心线程数为 8
- 最大线程数为 Integer.MAX_VALUE
- 工作队列是 synchronousQueue 同步队列
- 非核心线程空闲存活时间为 60 秒
工作机制:
- 提交线程任务
- 因为核心线程数为0,所以任务直接加到 synchronousQueue 工作队列
- 判断是否有空闲线程,如果有,就去取出任务执行
- 如果没有空闲线程,就新建一个线程执行
- 执行完任务的线程,还可以存活 60 秒,如果在这期间,接到任务,可以继续存活下去;否则
- 被销毁。
使用场景:用于并发执行大量短期的小任务。
③ SingleThreadExecutor
单线程化的线程池
线程池参数:
- 核心线程数为 1
- 最大线程数也为 1
- 阳塞队列是 LinkedBlockingQueue
- 非核心线程空闲存活时间为 0 秒
使用场景:适用于串行执行任务的场景,将任务按顺序执行。
④ ScheduledThreadPoo
能实现定时、周期性任务的线程池
线程池参数:
- 最大线程数为 Integer.MAX VALUE
- 阻塞队列是 DelayedWorkQueue
- keepAliveTime为0
使用场景:周期性执行任务,并且需要限制线程数量的需求场景。