IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 准确理解ThreadPoolExecutor的核心参数(corePoolSize、maximumPoolSize、workQueue)的工作机制 -> 正文阅读

[Java知识库]准确理解ThreadPoolExecutor的核心参数(corePoolSize、maximumPoolSize、workQueue)的工作机制

以前一直没有深刻准确的理解ThreadPoolExecutor的线程调度的规则,抽时间深入测试了下,总结记录分享下:

ThreadPoolExecutor(int corePoolSize,
? ? ? ? ? ? ? ? ? ?int maximumPoolSize,
? ? ? ? ? ? ? ? ? ?long keepAliveTime,
? ? ? ? ? ? ? ? ? ?TimeUnit unit,
? ? ? ? ? ? ? ? ? ?BlockingQueue<Runnable> workQueue)
Params:
corePoolSize – the number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOut is set
maximumPoolSize – the maximum number of threads to allow in the pool
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.
unit – the time unit for the keepAliveTime argument
workQueue – the queue to use for holding tasks before they are executed. This queue will hold only the Runnable tasks submitted by the execute method.
先说结论:corePoolSize-->workQueue-->maximumPoolSize

当n个请求过来的时候,线程池是这么处理的:

当n<=corePoolSize时:直接使用核心线程;

当n>corePoolSize时:先将核心线程占满,剩余的n-corePoolSize个请求将进入workQueue(阻塞队列),这里又分以下情况:

--------当n-corePoolSize<=workQueue的最大容量,全部进入workQueue;

--------当n-corePoolSize>workQueue的最大容量,请求先塞满workQueue,多余的请求n-corePoolSize-workQueue将根据maximumPoolSize-corePoolSize的余量开辟新的线程响应请求,

--------直到达到maximumPoolSize,停止创建,超出的请求(n-maximumPoolSize-workQueue)直接被拒绝

来个demo:corePoolSize=3;maximumPoolSize=5;workQueue=5;

(1)当n<=3:直接占用核心线程池;

(2)当n=4~8:3个核心线程占满、1个请求进入workQueue;

(3)当n=9~10:3个核心线程占满、5个请求进入workQueue、剩下的请求新开线程响应;

(4)当n>10:3个核心线程占满、5个请求进入workQueue、2个请求被新开线程响应、其余的请求直接拒绝

测试class:

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolTest {

    public static void main(String[] args) {
        LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(5);
        ThreadPoolExecutor executor = new ThreadPoolExecutor(3,
                5, 60 * 1000, TimeUnit.MILLISECONDS, queue);
        for (int i = 1; i < 12; i++) {
            //System.out.println("第"+i+"个线程准备启动");
            final int number = i;
            try {
                executor.execute(new Runnable() {

                    @Override
                    public void run() {
                        System.out.println("thread start : " + number + "  时间:" + System.currentTimeMillis()/1000);
                        try {
                            Thread.sleep(5 * 1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println("--------------------------");
        System.out.println("getCorePoolSize: "+executor.getCorePoolSize());
        System.out.println("getActiveCount: "+executor.getActiveCount());
        System.out.println("getPoolSize: "+executor.getPoolSize());
        System.out.println("getQueue: "+executor.getQueue().size());
        System.out.println("getMaximumPoolSize: "+executor.getMaximumPoolSize());
        System.out.println("--------------------------");
    }
}

运行结果:3个corePool(1/2/3)、5个queue(4/5/6/7/8)、2个临时开辟(9/10)、1个拒绝(11)

(感兴趣的可以修改三个核心参数,模拟其他case)

thread start : 2 ?时间:1649817402
thread start : 1 ?时间:1649817402
thread start : 3 ?时间:1649817402
thread start : 10 ?时间:1649817402
thread start : 9 ?时间:1649817402
--------------------------
getCorePoolSize: 3
getActiveCount: 5
getPoolSize: 5
getQueue: 5
getMaximumPoolSize: 5
--------------------------
java.util.concurrent.RejectedExecutionException: Task com.jd.xz.idata.service.utils.ThreadPoolTest$1@573fd745 rejected from java.util.concurrent.ThreadPoolExecutor@15327b79[Running, pool size = 5, active threads = 5, queued tasks = 5, completed tasks = 0]
? ? at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
? ? at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
? ? at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
? ? at com.jd.xz.idata.service.utils.ThreadPoolTest.main(ThreadPoolTest.java:17)
thread start : 4 ?时间:1649817407
thread start : 7 ?时间:1649817407
thread start : 5 ?时间:1649817407
thread start : 8 ?时间:1649817407
thread start : 6 ?时间:1649817407

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 23:36:51  更:2022-04-14 23:40:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:41:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码