专栏首页程序员备忘录线程池参数详解

线程池参数详解

我们知道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是拒绝策略,也就是上边说的任务队列满了之后线程池的响应策略。那么这个策略应该是可以自定义或者提供了比较常用的方式。

本文分享自微信公众号 - 程序员备忘录(gh_a84f9a607848),作者:tianjl

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ReentrantLock源码解析

    在java编程中,经常需要多代码进行加锁来防止多线程可能引起的数据不一致。而锁的类型有公平锁和非公平锁。公平锁的意义就是按照顺序,而非公平锁则是相反的。也就是说...

    程序员_备忘录
  • CAS机制是什么?

    因为多核CPU的存在,总是需要保障程序高性能的利用计算机的CPU资源,并要保障计算结果与预期的一致。因此常用的方式就是加锁方式。就是占用->占用结束->释放的...

    程序员_备忘录
  • Thread源码解析

    我们上学的时候都知道线程有两种方式,要么继承Thread类,要么实现runable接口。根据我们上次对线程池的分析,发现我们对Thread类的理解还比较浅显。所...

    程序员_备忘录
  • 多线程编程10个例子--2

    // TODO: Add extra initialization here m_ctrlProgress.SetRange(0,99); m_nMilliSe...

    李海彬
  • 多线程?怎么用?

    进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

    故里
  • 读书笔记《Java并发编程的艺术 - 方腾飞》- Java并发编程

    在Java中, 我们可以通过 priority 属性来设置线程的优先级, 参数为 1 ~ 10 参数越大, 代表优先级越高, 默认的优先级为 5

    lvgo
  • 多线程开发,先学会线程池吧

    在实际开发场景中,我们经常要使用多线程开发应用,比如实现异步操作,或者为了提高程序的效率等等。但是以前我见过有实习生在使用的时候是直接new Runable()...

    java技术爱好者
  • 并发编程面试题汇总

    thinkwon.blog.csdn.net/article/details/104863992

    Java旅途
  • java学习笔记(基础篇)—线程

    线程是程序执行的最小单位,是动态的。 进程是系统进程资源分配和系统调度的最小单位,是动态的。 线程和进程的目的:多任务--->效率高

    chlinlearn
  • Thread方法

    这个方法返回线程的 ID 值,类型为 long。线程的 ID 在线程的整个生命周期中都不变。

    宇宙之一粟

扫码关注云+社区

领取腾讯云代金券