目录
三、ScheduledThreadPool(定时任务线程池)
一、FixedThreadPool(固定线程池)
1.固定线程池的七个核心参数
- corePoolSize(核心线程数):使用者来指定,表示线程池中保持的线程数,即使线程处于空闲状态也不会被回收。
- maximumPoolSize(最大线程数):最大线程数等于核心线程数,即当核心线程数已满,且没有空闲线程时,无法创建非核心线程,仅允许进入工作队列进行等待。
- keepAliveTime(线程空闲时间):0,表示非核心线程在空闲状态下的最长存活时间。
- unit(时间单位):毫秒,表示线程空闲时间的单位。
- workQueue(工作队列):LinkedBlockingQueue。
- threadFactory(线程工厂):默认线程工厂。
- handler(拒绝策略):默认拒绝策略。
2.特点
该线程池维护固定数量的线程,线程数不会随着任务的增加而增加。如果所有线程都处于忙碌状态,新任务会被放入等待队列中,直到有空闲线程可用。
3.使用场景
适用于需要控制并发线程数的场景。例如,当需要限制系统中同时执行的任务数量时,可以使用FixedThreadPool。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
二、CachedThreadPool(缓存线程池)
1.缓存线程池的七个核心参数
- corePoolSize(核心线程数):0
- maximumPoolSize(最大线程数):Integer.MAX_VALUE(2147483647)
- keepAliveTime(线程空闲时间):60秒
- unit(时间单位):秒
- workQueue(工作队列):SynchronousQueue,一个没有容量的阻塞队列。
- threadFactory(线程工厂):默认的线程工厂。
- handler(拒绝策略):ThreadPoolExecutor.AbortPolicy,当线程池无法执行新任务时,会抛出RejectedExecutionException异常。
2.特点
该线程池根据需要创建新线程,但在可用线程可用时重用旧线程。如果线程在60秒内未被使用,则被终止并从线程池中移除。
3.使用场景
适用于执行大量短期异步任务的场景,例如处理大量的客户端请求。由于线程数不受限制,可以根据任务的数量动态调整线程数,提高系统的响应速度。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
三、ScheduledThreadPool(定时任务线程池)
1.定时任务线程池的七个核心参数
- corePoolSize(核心线程数):指定的线程数
- maximumPoolSize(最大线程数):Integer.MAX_VALUE
- keepAliveTime(线程空闲时间):0
- unit(时间单位):纳秒
- workQueue(工作队列):DelayedWorkQueue,一个按照任务的延迟时间排序的阻塞队列。
- threadFactory(线程工厂):默认的线程工厂。
- handler(拒绝策略):ThreadPoolExecutor.AbortPolicy,当线程池无法执行新任务时,会抛出RejectedExecutionException异常。
2.特点
该线程池用于执行定时任务和周期性任务。可以指定任务的执行时间和执行频率。
3.使用场景
适用于需要定期执行任务的场景,例如定时备份数据、定时发送邮件等。通过ScheduledThreadPool,可以方便地执行定时任务,而无需手动管理线程的创建和销毁。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
四、SingleThreadPool(单线程池)
1.单线程池的七个核心参数
- corePoolSize(核心线程数):1
- maximumPoolSize(最大线程数):1
- keepAliveTime(线程空闲时间):0
- unit(时间单位):纳秒
- workQueue(工作队列):LinkedBlockingQueue,一个无界阻塞队列。
- threadFactory(线程工厂):默认的线程工厂。
- handler(拒绝策略):ThreadPoolExecutor.AbortPolicy,当线程池无法执行新任务时,会抛出RejectedExecutionException异常。
2.特点
该线程池只有一个线程在工作,所有任务按照顺序执行。如果当前线程意外终止,会创建一个新线程来替代。
3.使用场景
适用于需要保证任务按照顺序执行的场景,即将并行执行转化为串行执行。例如,需要按照任务提交的顺序依次执行任务时,可以使用SingleThreadPool。由于只有一个线程在工作,可以避免多线程并发带来的竞态条件和线程安全问题。
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}