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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSH实现远程控制

    SSH(SecureShell)是一种能够提供安全远程登录会话的协议,使用ssh可以在远程linux中执行命令。sshd服务提供两种安全验证的方法:(1)基于口令的安全验证:经过验证帐号与密码即

    2021年12月28日
    45
  • pycharm自动退出_pycharm怎么debug

    pycharm自动退出_pycharm怎么debug起因:今天在学习py的时候,学到了numpy以及pandas,然后我的pycharm莫名其妙就进入了一个啥啥科学模式,就是执行代码都在pythonConsole里面去了,原谅小白不懂这玩意。。。然后怎么也回不到过去了!!!小白都惊呆了,这可咋整。。于是去求助开发大佬~得到解决方法如下:Settings–>Tools–>PythonScientific>Showplotsintoolwindow取消勾选View取消勾选ScientificMode

    2022年8月25日
    4
  • AbstractQueuedSynchronizer_setcursel函数用法

    AbstractQueuedSynchronizer_setcursel函数用法executeScalar 用于查询    返回影响的行的第一行第一列ExecuteNonQuery 用于增、删、改? 返回受影响的行数

    2025年9月6日
    5
  • mysql修改表名

    mysql修改表名ALTER TABLE table_nameRENAMETOnew_table_name

    2022年6月1日
    29
  • 软件工程项目_软件工程对象模型图

    软件工程项目_软件工程对象模型图软件工程中应用的几种图辨析:系统流程图、数据流图、数据字典、实体联系图、状态转换图、层次方框图、Warnier图、IPO图、层次图、HIPO图、结构图、程序流程图、盒图、PAD图、判定表、判定树、Jackson图、流图、甘特图、工程网络图我们先将这几种图按照软件工程中的阶段分类~接下来看一下这些图都长什么样子~1.系统流程图2.数据流图3.数据字典4.E-R图5.状态转换图:6…

    2022年8月13日
    5
  • js操作DropDownList大全

    js操作DropDownList大全一:js设置DropDownList选中某项 1.根据Value值设置选中某项   例子如下: HTML代码: 选项0选项1  JS代码:document.getElementById(“ddlFolder”).value=”0″;//0为你要选中的项的value  2.根据Text值设置选中某项

    2022年10月16日
    1

发表回复

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

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