Java线程池参数分析「建议收藏」

Java线程池参数分析「建议收藏」线程池组成创建线程池创建线程池通过Executors的工厂方法来创建线程池实例。实际上Executors创建的线程池实例最终都是通过实例化配置不同参数的ThreadPoolExecutor对象。 publicstaticExecutorServicenewFixedThreadPool(intnThreads){returnnewThreadPoolEx…

大家好,又见面了,我是你们的朋友全栈君。

线程池组成

20190130152016-image.png

创建线程池

创建线程池通过Executors的工厂方法来创建线程池实例。
20190130150755-image.png
实际上Executors创建的线程池实例最终都是通过实例化配置不同参数的ThreadPoolExecutor对象。

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

线程池的参数

下面详细讲解ThreadPoolExecutor的核心配置参数

    /**
     * Creates a new {@code ThreadPoolExecutor} with the given initial
     * parameters.
     *
     * @param corePoolSize the number of threads to keep in the pool, even
     *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
     * @param maximumPoolSize the maximum number of threads to allow in the
     *        pool
     * @param keepAliveTime when the number of threads is greater than
     *        the core, this is the maximum time that excess idle threads
     *        will wait for new tasks before terminating.
     * @param unit the time unit for the {@code keepAliveTime} argument
     * @param workQueue the queue to use for holding tasks before they are
     *        executed.  This queue will hold only the {@code Runnable}
     *        tasks submitted by the {@code execute} method.
     * @param threadFactory the factory to use when the executor
     *        creates a new thread
     * @param handler the handler to use when execution is blocked
     *        because the thread bounds and queue capacities are reached
     * @throws IllegalArgumentException if one of the following holds:<br>
     *         {@code corePoolSize < 0}<br>
     *         {@code keepAliveTime < 0}<br>
     *         {@code maximumPoolSize <= 0}<br>
     *         {@code maximumPoolSize < corePoolSize}
     * @throws NullPointerException if {@code workQueue}
     *         or {@code threadFactory} or {@code handler} is null
     */
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        ...
    }

int corePoolSize

核心线程数量,线程池将长期保证这些线程处于存活状态,即使线程已经处于闲置状态。除非配置了allowCoreThreadTimeOut将不会保证长期存活于线程池内,在闲置超过keepAliveTime后被销毁。

int maximumPoolSize

线程池内的最大数量,线程池内维护的线程不得超过该数量,大于核销线程数量小于最大线程数量的线程将在闲置超过keepAliveTime后被销毁。

long keepAliveTime

保证存活时间,若线程数超过了corePoolSize,线程闲置时间超过了保证存活时间,该线程将被销毁。另外unit指的是保活时间的单位。

BlockingQueue workQueue

阻塞队列,存放等待执行的任务,线程从workQueue中取任务,若无任务将阻塞等待。可以传入限制容量大小的队列或无限拓展队列。

ThreadFactory threadFactory

创建线程的工厂。

RejectedExecutionHandler handler

处理线程池及队列满载后的拒绝请求处理器。

线程池数量变化

假定一个核心线程数量为10、最大线程数量为20、线程队列限制最大为5的线程池,其内部线程、任务数量变化如下:
20190130154611-image.png

A-B

初始线程为空,每一次提交任务,容器比对当前维护线程数量都小于核心线程数量,故每次都新建线程直到达到了核心线程数量。

B-C

线程数量已经达到了核心线程数量,当前无空闲线程,任务堆积到队列中,直到任务队列达到最大数量。

C-D

由于任务队列已经达到饱和,所有线程仍然在被占用状态,但线程数量为达到最大线程数,尝试再次新建线程。

D-E

线程数量已经达到最大值,线程池已满,任务队列逐渐占满。

E-F

线程池数量达到最大、队列任务数达到最大,无法接受新的任务提交,对任务提交拒绝。

F-H

任务逐步被执行完成,队列内任务被清空,线程数量依然大于核心线程数量,当有线程空闲时间达到了保活时间将被销毁知道线程数量恢复核心线程数。

H-I

没有需要执行的任务,线程空闲,由于数量等于核心线程数,无需销毁线程,各个线程监听阻塞队列等待新的任务。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136306.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • php开发环境的配置过程_mac配置java环境

    php开发环境的配置过程_mac配置java环境VsCode系列:VSCode配置Python开发环境!今天博主跟大家聊一聊如何使用VsCode系列:VSCode配置Python开发环境!不喜勿喷,如有建议欢迎补充、讨论!关于安装和汉化可以观看博主的这篇文章《下载安装及汉化》以及Python系列:windows10配置Python3.0开发环境!,安装完毕重启VsCode!Comeon!首先请大家确定VsCode的安装以及Pyt…

    2022年10月26日
    0
  • C# 经典排序算法大全

    C# 经典排序算法大全

    2022年1月4日
    40
  • pycharm2020.2永久激活码(JetBrains全家桶)

    (pycharm2020.2永久激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~0E14…

    2022年3月28日
    509
  • Pytest(15)pytest分布式执行用例「建议收藏」

    Pytest(15)pytest分布式执行用例「建议收藏」前言平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间

    2022年7月30日
    7
  • 怎么完全卸载赛门铁克_Symantec卸载方法,赛门铁克卸载「建议收藏」

    怎么完全卸载赛门铁克_Symantec卸载方法,赛门铁克卸载「建议收藏」1、首先在服务里面设置所有Symantec开头的系统服务为禁止(控制面板-管理工具-服务),重启后在命令行运行:smc-stop;(stop需要密码就关掉先)2、删除HKEY_LOCAL_MACHINE/SOFTWARE/Symantec/SymantecEndpointProtection/SMC下的SmcInstData子键;(删除后F5刷新下,如果这个子键又自己出现了,说明有Syman…

    2022年4月27日
    118
  • ue4 弱指针_智能指针如何实现自动释放

    ue4 弱指针_智能指针如何实现自动释放原创文章,转载请注明出处。UE4也有一套智能指针库,整理了一下做个介绍。也请大家做补充。共享指针/共享引用/弱指针/注意事项一.TSharePtr1.如何创建一个TSharePtr2.TSharePtr如何进行类型转换1)TSharePtr转TSharePtr2)ConstTSharePtr转TSharePtr3)TSharePtr转TShareRef3.使用注意事项1)TSharePtr2)类型转换二.TShareRef1.如何创建一个TShareRef2.TShareRef如何进行类型转换1)TS

    2022年10月4日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号