2023-2更文4-ThreadPoolExecutor自定义线程池

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

ThreadPoolExecutor自定义线程池

前文

本文内容主要是关于自定义线程池相关知识的总结,主要是通过jdk提供的ThreadPoolExecutor进行自定义线程池的处理。

如何自定义线程池

在日常的开发工作中,线程是一个不可避免的知识点。当我们需要新建线程时,不推荐手动进行线程的创建。同一个项目中最佳的处理方式是采用同一个线程池,统一进行多线程的管理。如果采用自行创建线程的方式,需要反复承担线程创建及销毁过程的资源浪费,以及当同时创建过量线程时,也会对系统稳定性及性能产生影响。

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

如上代码所示,采用jdk提供的线程创建工具创建线程时,需要传递如上7个参数。当然,jdk中也提供了另外几种少于7个参数的创建方案,但其实本质上均是以上的初始化方式,只是后三个参数采用了默认数值。下面对其中的参数进行详细介绍:

  • corePoolSize 表示该线程池默认的常驻线程数量
  • maximumPoolSize 表示该线程池所允许的最多线程数量
  • keepAliveTime 表示当前线程数目超过核心线程数目时,销毁前等待新的任务拉起线程的时间
  • unit 表示线程销毁等待时间的时间单位,一般为分、秒等
  • workQueue 表示等待执行任务的存储队列,例如缓存线程就是采用SyncoronizedQueue,保持队列中只有一个任务来实现
  • threadFactory 表示创建线程时所采用的线程创建工厂
  • handler 表示处理线程的拒绝策略,也就是当线程及等待队列均已满额时,新来的任务采用哪一种拒绝策略,一般包括任务直接丢弃、任务丢弃抛出异常、丢弃最老任务、主线程直接执行以及自定义拒绝策略等

通过对于以上参数的指定,能够实现我们对于线程时初始化的参数设定,满足我们实际的开发需求。

总结

jdk所提供的线程池是我们开发过程中创建线程非常常用的一种方式,能够避免手动创建线程时可能出现的若干问题,而给定的参数则可以由我们自己进行组合,实现满足我们需求的线程池。