JAVA线程池
Posted 纳纳小江
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA线程池相关的知识,希望对你有一定的参考价值。
01
—
JAVA线程池的好处
02
—
线程池的实现原理
当向线程池中提交一个任务时,线程池会首先判断线程池中的核心线程是否已满。如果没满,就创建一个核心线程执行任务,如果线程池核心线程数已满;则线程池会继续判断工作队列是否已经满了,如果队列没满,就将提交的线程放到工作队列中,如果队列已满,就判断线程池中的最大线程数是否满了,不满则创建一个工作线程来执行任务(这一步需要获取全局锁),如果已经满了就提交到配置的饱和策略来处理这个任务
03
—
线程池的参数
首先,先看看线程池中各个参数的含义,上图显示线程池中的几个主要的参数,corePoolSize是核心线程数,表示线程池中常驻线程数量,和他相似的还有一个maxPoolSize(最大线程池数),当程序提交的任务特别多,corePoolSize无法满足需求的时候,就会先线程池中增加线程,以便于应对任务突增的情况,还有就是这个处理体验除了线程池的好处,避免一下子创建很多的线程,而是视任务而言去处理。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize 线程池的基本大小;当提交一个任务给线程池的时候,线程池会创建一个线程来执行这个任务,当线程池中的核心线程数到达这个数量的时候,就不再创建了,就交给后面的参数来处理
maximumPoolSize 线程池的最大线程数,当线程池的核心线程数达到最大,并且任务队列已经满了的情况话,就会创建工作线程到这个数字,然后根据配置的拒绝策略来处理新提交的任务
keepAliveTime+TimeUnit unit 当线程池中线程数量多于核心线程数时,而此时又没有任务可做,线程池就会检测线程的 keepAliveTime,如果超过规定的时间,无事可做的线程就会被销毁,以便减少内存的占用和资源消耗。如果后期任务又多了起来,线程池也会根据规则重新创建线程,所以这是一个可伸缩的过程,比较灵活,我们也可以用 setKeepAliveTime 方法动态改变 keepAliveTime 的参数值。
BlockingQueue<Runnable> 任务队列,用于保存等待执行的任务的阻塞队列,可以选择以下几种队列
ThreadFactory ThreadFactory 实际上是一个线程工厂,它的作用是生产线程以便执行任务。我们可以选择使用默认的线程工厂,创建的线程都会在同一个线程组,并拥有一样的优先级,且都不是守护线程,我们也可以选择自己定制线程工厂,以方便给线程自定义命名,不同的线程池内的线程通常会根据具体业务来定制不同的线程名
RejectedExecutionHandler线程池拒绝策略
以上是关于JAVA线程池的主要内容,如果未能解决你的问题,请参考以下文章
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段