线程池的参数有哪些?

377 阅读2分钟

我们首先创建一个线程池

public class ThreadPoolParameters {

    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
    }
}

当然,上面的参数是随便填的,进入 Executors.newFixedThreadPool里面,查看创建 FixedThreadPool线程池的源码,如下就是它源码的一部分

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

我们再进一步进入 ThreadPoolExecutor对象里面,下面是一部分源码

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

我们可以从上面这个线程池中的 this,找到参数最多的创建线程池的代码

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

上面只截取了参数部分代码,下面的实现部分没截取,以下是参数部分

corePoolSize

核心线程数,这是线程空闲时可以保存的线程数,线程池刚创建时,可以指定 corePoolSize的个数,而后线程池可以创建多个线程直到到达 corePoolSize的个数,如果没有特殊设置,corePoolSize线程一创建,就不会主动销毁,即使是在空闲的时间

maximumPoolSize

最大线程数量,指的是一个线程池最多可以创建线程的个数,maximumPoolSize ≥ corePoolSize,当maximumPoolSize 的设置的大于数量 corePoolSize且线程需要创建超出 corePoolSize线程直到 maximumPoolSize个数的话,之后在线程池空闲的时间,线程池会根据 keepAliveTime参数设置的时间销毁多于 corePoolSize个数的线程

keepAliveTime

空闲线程存活时间,当线程池创建的线程数大于 corePoolSize但小于等于maximumPoolSize的时候,只要线程处于空闲的时候,线程池会根据 keepAliveTime设置的时间去销毁多出 corePoolSize个数的线程

unit

线程池设置 keepAliveTime的时间单位,上面的 FixedThreadPool默认的时间单位是 TimeUnit.MILLISECONDS,也就是毫秒级别

workQueue

阻塞队列,存放任务的工作队列,用来存放 corePoolSize处理不过来的任务

threadFactory

线程工厂,用来生产线程以便去处理任务,可以自定义适合业务的线程工厂

handler

任务拒绝策略,用来处理当 workQueue已经满且 maximumPoolSize达到最大上限的时候,用来处理新提交的任务


欢迎大家关注下个人的「公众号」:独醉贪欢