Java创建线程池的方法

Executors创建四种线程池:

CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。

ScheduledThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。

SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。

FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量。

创建方式

public class ThreadPoolDemo {
    public static void main(String[] args) {
        Executors.newFixedThreadPool(3);
        Executors.newCachedThreadPool();
        Executors.newScheduledThreadPool(3);
        Executors.newSingleThreadExecutor();
    }
}

实际开发中采用ThreadPoolExecutor创建线程池:

原因:

  • FixedThreadPool和SingleThreadExecutor => 允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而引起OOM异常
  • CachedThreadPool => 允许创建的线程数为Integer.MAX_VALUE,可能会创建大量的线程,从而引起OOM异常

创建方式

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

ThreadPoolExecutor参数说明:

corePoolSize : 线程池核心池的大小

maximumPoolSize : 线程池的最大线程数

keepAliveTime :线程最大空闲时间

unit : 时间单位

workQueue : 用来储存等待执行任务的队列

threadFactory : 线程工厂

handler :拒绝策略

四种拒绝策略

当提交任务数大于 corePoolSize 的时候,会优先将任务放到 workQueue 阻塞队列中。当阻塞队列饱和后,会扩充线程池中线程数,直到达到 maximumPoolSize 最大线程数配置。此时,再多余的任务,则会触发线程池的拒绝策略了。

  • AbortPolicy - 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。
  • CallerRunsPolicy-由调用者线程执行
  • DiscardPolicy - 直接丢弃
  • DiscardOldestPolicy - 当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入
上一篇:浅析Java的线程池:介绍、优势、设计思路(类比工厂)、参数介绍、任务队列、4种拒绝策略、5种状态


下一篇:docker compose 笔记