开启掘金成长之旅!这是我参与「掘金日新计划 · 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所提供的线程池是我们开发过程中创建线程非常常用的一种方式,能够避免手动创建线程时可能出现的若干问题,而给定的参数则可以由我们自己进行组合,实现满足我们需求的线程池。