线程池参数详解

时间:2022-07-23
本文章向大家介绍线程池参数详解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

我们知道JUC提供了丰富的并发工具类,其中类似于组的结构叫做线程池。就是说我们可以将我们需要运行的线程加入到这个组内,然后通过启动线程池来执行加入到线程池的所有任务。既然是容器,那么必然会有很多参数为容器运行的界定边界。那么这些参数又有什么意义?通过理解这些参数我们也可以从侧面了解线程池的逻辑形式和运行机理。

  public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

上述代码是用来初始化一个ThreadPoolExecutor,也就是线程池执行器。因为线程池并不单单是容器,还是还有很多操作线程的方法。

其主要的参数有corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler

其中

corePoolSize很好理解,就是核心线程数。也就是在线程池中肯定存在的线程数。

maximumPoolSize是最大线程数。就是随着加入线程池的线程越来越多线程池创建的线程会越来越多,那么索要创建的线程数目的上限是是多少。这个数字就是用来描述这个的。

现在最小和最大都有的还缺什么?

我们看到keepAliveTime,keepAliveTime是用来描述线程销毁的闲置时间量,如果任务加入到线程池线程池的核心线程在处理其他任务。所以线程池创建了新的线程。但是新线程处理完毕该任务之后等待了keepAliveTime时间没有新任务。那么该线程就会销毁。allowCoreThreadTimeout是用来描述核心线程时候可以在keepAliveTime时间的空闲中退出。其中传入的参数unit也就是一个处理keepAliveTime的工具罢了。

workQueue从字面上理解应该是工作队列。而且这个队列是BlockingQueue,我们之前学过BlockingQueue的类型。LinkedBlockingDeque、ArrayBlockingQueue、PriorityBlockingQueue、SynchronousQueue。这里要求我们传入的是Runable类型,也就是传入的是任务。回顾一下我们上学时候学的Thread类,那么Thread就是线程了,而runable则是执行的任务了。那么WorkQueue应该就是我们提交的任务的存储容器。如果核心线程再处理任务。那么就会创建新线程处理提交的任务。如果线程的数量达到了maximumPoolSize之后就不再创建线程,也就是再来的任务就会加入到这个队列中。等待线程执行。如果超过了这个容量估计会会拒绝任务的提交。

threadFactory是线程工厂,主要用来创建线程。

handler是拒绝策略,也就是上边说的任务队列满了之后线程池的响应策略。那么这个策略应该是可以自定义或者提供了比较常用的方式。