Java中的线程池

JAVA线程池的好处

02

线程池的实现原理

当向线程池中提交一个任务时,线程池会首先判断线程池中的核心线程是否已满。如果没满,就创建一个核心线程执行任务,如果线程池核心线程数已满;则线程池会继续判断工作队列是否已经满了,如果队列没满,就将提交的线程放到工作队列中,如果队列已满,就判断线程池中的最大线程数是否满了,不满则创建一个工作线程来执行任务(这一步需要获取全局锁),如果已经满了就提交到配置的饱和策略来处理这个任务

03

线程池的参数

 

首先,先看看线程池中各个参数的含义,上图显示线程池中的几个主要的参数,corePoolSize是核心线程数,表示线程池中常驻线程数量,和他相似的还有一个maxPoolSize(最大线程池数),当程序提交的任务特别多,corePoolSize无法满足需求的时候,就会先线程池中增加线程,以便于应对任务突增的情况,还有就是这个处理体验除了线程池的好处,避免一下子创建很多的线程,而是视任务而言去处理。

public ThreadPoolExecutor(int corePoolSize,                          int maximumPoolSize,                          long keepAliveTime,                          TimeUnit unit,                          BlockingQueue<Runnable> workQueue,                          ThreadFactory threadFactory,                          RejectedExecutionHandler handler)
    1. corePoolSize 线程池的基本大小;当提交一个任务给线程池的时候,线程池会创建一个线程来执行这个任务,当线程池中的核心线程数到达这个数量的时候,就不再创建了,就交给后面的参数来处理

    2. maximumPoolSize 线程池的最大线程数,当线程池的核心线程数达到最大,并且任务队列已经满了的情况话,就会创建工作线程到这个数字,然后根据配置的拒绝策略来处理新提交的任务

    3. keepAliveTime+TimeUnit unit 当线程池中线程数量多于核心线程数时,而此时又没有任务可做,线程池就会检测线程的 keepAliveTime,如果超过规定的时间,无事可做的线程就会被销毁,以便减少内存的占用和资源消耗。如果后期任务又多了起来,线程池也会根据规则重新创建线程,所以这是一个可伸缩的过程,比较灵活,我们也可以用 setKeepAliveTime 方法动态改变 keepAliveTime 的参数值。

    4. BlockingQueue<Runnable> 任务队列,用于保存等待执行的任务的阻塞队列,可以选择以下几种队列

       

    5. ThreadFactory  ThreadFactory 实际上是一个线程工厂,它的作用是生产线程以便执行任务。我们可以选择使用默认的线程工厂,创建的线程都会在同一个线程组,并拥有一样的优先级,且都不是守护线程,我们也可以选择自己定制线程工厂,以方便给线程自定义命名,不同的线程池内的线程通常会根据具体业务来定制不同的线程名

    6. RejectedExecutionHandler线程池拒绝策略

原文地址:https://www.cnblogs.com/ideajiang/p/14170332.html