JDK自带的线程池有哪些?
JDK自带的线程池主要包括以下几种类型:
-
FixedThreadPool(固定大小线程池):
- 由
Executors.newFixedThreadPool(int nThreads)
工厂方法创建。 - 线程池的大小固定,即核心线程数和最大线程数相等,且在创建时指定。
- 当线程池中的所有线程都在处理任务时,新提交的任务会被放入无界的工作队列中等待,直到有线程空闲出来。
- 适用于任务数量可控且并行度要求较高的场景,能够避免过多线程造成的资源浪费。
- 由
-
CachedThreadPool(缓存线程池):
- 由
Executors.newCachedThreadPool()
工厂方法创建。 - 线程池的大小不固定,可根据需要自动调整。
- 当线程池中的线程都在处理任务时,新提交的任务会创建新的线程来执行,理论上线程数量无上限。
- 线程空闲一段时间(通常为60秒)后会被自动回收,以释放系统资源。
- 适用于处理大量短生命周期任务或者任务的创建和销毁开销较大的场景,能够快速响应新任务并减少线程创建和销毁的开销。
- 由
-
SingleThreadExecutor(单一线程池):
- 由
Executors.newSingleThreadExecutor()
工厂方法创建。 - 线程池中仅有一个工作线程,确保所有任务按照提交顺序在同一个线程中串行执行。
- 新提交的任务如果发现线程正在执行其他任务,则会进入无界的工作队列中等待。
- 适用于需要保证任务按照提交顺序执行,或者避免因并行而导致数据竞争等问题的场景。
- 由
-
ScheduledThreadPool(定时器线程池):
- 由
Executors.newScheduledThreadPool(int corePoolSize)
工厂方法创建。 - 除了具备基本的线程池功能外,还支持延时任务和周期性任务的执行。
- 扩展自
ThreadPoolExecutor
,实现了ScheduledExecutorService
接口。 - 可以用来安排任务在未来某个时间点执行一次,或者定期重复执行。
- 由
这些线程池都是通过 java.util.concurrent.Executors
类中的静态工厂方法创建的,它们内部均基于 ThreadPoolExecutor
类实现,只是预设了不同的配置参数。如果你需要更细粒度的控制,可以直接使用 ThreadPoolExecutor
构造函数来创建自定义线程池,指定核心线程数、最大线程数、线程存活时间、工作队列类型、线程工厂以及拒绝策略等参数。