四种常用线程池

本文详细介绍了Java中的四个主要线程池类型:FixedThreadPool(固定线程池)、CachedThreadPool(缓存线程池)、ScheduledThreadPool(定时任务线程池)和SingleThreadPool(单线程池),包括它们的核心参数、特点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、FixedThreadPool(固定线程池)

1.固定线程池的七个核心参数

2.特点

3.使用场景

二、CachedThreadPool(缓存线程池)

1.缓存线程池的七个核心参数

2.特点

3.使用场景

三、ScheduledThreadPool(定时任务线程池)

1.定时任务线程池的七个核心参数

2.特点

3.使用场景

四、SingleThreadPool(单线程池)

1.单线程池的七个核心参数

2.特点

3.使用场景


一、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>()));
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值