java中线程池-ThreadPoolExecutor中corePoolSize和maximumPoolSize的理解

2023-05-16

import java.io.IOException;

public class Mythread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "执行中...");
        try {
            System.in.read();
        } catch (IOException e) {
            System.out.println("error" + e);
        }
        System.out.println(Thread.currentThread().getName() + "over...");
    }
}
public static void main(String[] args) throws Exception {
        BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(2);

        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2, 4, 2, TimeUnit.SECONDS, queue);
        Mythread t1 = new Mythread();
        Mythread t2 = new Mythread();
        Mythread t3 = new Mythread();
        Mythread t4 = new Mythread();
        Mythread t5 = new Mythread();
        Mythread t6 = new Mythread();
        Mythread t7 = new Mythread();
        poolExecutor.execute(t1);
        poolExecutor.execute(t2);
        poolExecutor.execute(t3);
        poolExecutor.execute(t4);
        poolExecutor.execute(t5);
        poolExecutor.execute(t6);
        poolExecutor.execute(t7);

        poolExecutor.shutdown();
}

上面是我模拟使用了下ThreadPoolExecutor,下面让我们来一起了解下ThreadPoolExecutor对应的几个参数

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
  • corePoolSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime:空闲线程能存活的最长时间
  • unit:上面keepAliveTime对应的单位,分、秒等
  • workQueue:等待队列

这篇文章主要想说下corePoolSize和maximumPoolSize的区别,为了搞清楚这个,接下来,让我们debug下上面的测试代码吧
1、当我们往线程池中添加第5个线程的时候,现在线程池中的状态是,正在运行的线程有两个,等待队列的任务有两个,那如果添加完第5个线程呢?
ThreadPoolExecutor
2、有没有发现好像有点意思了,现在是队列满了,才会新创建线程,继续往下走
ThreadPoolExecutor
3、现在最大线程数达到了4个,队列也有2个,也满了,接下来会发生生么呢?
ThreadPoolExecutor
4、当我们添加第7个任务时,一步步跟进去,发现走到了抛出拒绝当前这个任务的异常
ThreadPoolExecutor
综上所述:当任务大小到达coreSize大小时,任务可以正常运行,当任务个数大于coreSize的大小时,任务就先会放在等待队列中,当等待队列也放满了,接下来才会创建线程,知道当前线程数等于最大线程数,当队列也满了,也达到最大线程数了,接下来添加的任务都会被拒绝掉,直接抛出异常

注:添加任务的顺序和任务执行的顺序并不一样

public class ReduceTest {
    public static void main(String[] args) {
        //int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20, 0, TimeUnit.MINUTES,
                new ArrayBlockingQueue<>(10));
        for (int i=0; i<100; ++i) {
            threadPoolExecutor.execute(new Mytask(i));
        }
    }
}

class Mytask implements Runnable {

    private int i;

    public Mytask(int s) {
        this.i = s;
    }

    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + ": " + i);
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

并发编程
上图中是执行代码的结果,从图中我们可以看出来,任务执行的顺序有点诡异,为什么9-19的任务不是先于20-29,下图中的源码可以解释这个原因
在这里插入图片描述
当队列满了,添加后面的任务的时候,首先先判断该任务为空么,不为空的话,直接执行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中线程池-ThreadPoolExecutor中corePoolSize和maximumPoolSize的理解 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static

随机推荐

  • 解决error:legacy boot of uefi media

    错误 uefi媒体的传统引导 可能你的是GPT分区 xff0c 要改成UEFI引导 按F2 进入bios更换其他引导 xff0c 不同的品牌有自己进入的bios的方式 xff0c 我的是F2 按F10保存 解决
  • MongoDB安全实战之SSL协议加密

    邓开表同学实战MongoDB系列文章 xff0c 非常不错 xff0c 赞 xff01 大力推荐 xff01 本文主要讲述MongoDB的SSL协议加密的使用和配置的实战经验 xff0c 非常值得一看 前面系列文章 xff1a MongoD
  • 关于开源项目——C语言实现FTP服务器的结构解析

    项目地址 xff1a https github com beckysag ftp 针对此开源项目的说明 xff0c 结构分析 服务端整体框架 xff1a 1 从命令行输入得到服务端绑定端口号 2 设置套接口选项 xff0c 创建监听套接字
  • Nvidia Xavier NX 刷机 内置EMMC 带固态版

    Nvidia Xavier NX 刷机 内置EMMC 带固态版 前言一 烧录系统1 准备linux系统的电脑一台2 下载SDK Manager3 烧录过程 二 将NX系统迁移到NVME固态硬盘上1 格式化分区2 将EMMC SD卡的root
  • 关于vscode安装包下载太慢解决方法(详解)

    方法一 第一步 vscode官网选择下载版本 vscode官网 这里直接按系统选择合适的版本进行下载 xff01 第二步 进入下载界面 xff08 这一步别着急 xff0c 一定要进入下载过程 xff09 这里一定要点击保存 xff01 下
  • java 导出excel

    目录 一 动态下拉框二 合并行单元格三 复杂表头四 批量生成文件上传到文件服务器 xff0c 再从文件服务器批量下载压缩成压缩包后导出 一 动态下拉框 如何得到这样一张表格 xff1f 在单元格中插入可选下拉框 思路分析 xff1a exc
  • win10 H3C 映射外网端口,实现外网端口访问

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 cmd 进入 控制台 登录H3C命令行控制台 xff0c 输入账号密码 查看dns网卡等基本信息 进入系统视图 映射 查看映射情况
  • VMware Workstation v16.2 + CentOS6.5命令行模式

    VMware下载地址和安装教程 CentOS官网下载 文章目录 一 VMware部分1 新建虚拟机2 选择驱动3 配置网络 xff08 NAT配置 xff09 二 CentOs部分1 安装驱动2 联网补充 xff1a 一 VMware部分
  • 并发编程(一)cpu,进程,线程,并发

    文章目录 一 程序和进程1 程序的进化论2 程序和进程的关系3 进程和线程的关系4 CPU和RAM的关联5 CPU 进程 线程之间的关系6 CPU如何执行 二 线程1 线程的使用2 线程的生命周期 三 并发和并行1 并发和并行2 高并发的定
  • 并发编程(二)原子性和Synchronized同步锁

    文章目录 一 原子性1 什么是原子性2 造成原子性的原因3 解决原子性问题之Synchronized同步锁 二 Synchronized1 Synchronized的使用2 Synchronized的原理2 1 JVM的结构 2 2 类的加
  • 【异常】执行yum install lrzsz 报错

    报错信息如图 可以看出yum源出了问题 xff0c 配置yum源 按以下步骤执行 配置yum源 xff1a cd etc yum repos d mkdir bak mv repo bak vi iso repo span class hl
  • 【笔记】etc/profile和~/.bashrc的区别

    在搭建单节点的hadoop集群时 xff0c jdk的环境变量是在 bashrc 文件中配置的 而搭建三节点的hadoop集群时 xff0c 是在root用户下的 etc profile目录下配置的环境变量 两者有什么区别呢 xff1f e
  • sql存储过程语法详解

    一 定义变量 使用关键字declare申明变量 xff1a declare 64 变量名 变量类型 span class hljs comment 简单赋值 span declare span class hljs variable 64
  • Can't open the mysql.plugin table. Please run mysql_upgrade to create it.

    mysql 5 6 43 xff0c windows10 安装好之后 xff0c 在命令行net start mysql 时 xff0c 打印mysql 服务无法启动 1067 进程意外停止 进入事件查看器 缺少mysql plugin表
  • JavaScript学生管理系统

    JavaScript学生管理系统 一 系统功能描述1 系统界面2 查看全部学员信息3 搜索学生信息4 添加学生信息5 修改学生信息6 删除学生信息7 退出系统8 检查学号是否存在 二 完整代码 一 系统功能描述 1 系统界面 系统总共包含功
  • touchGFX 初探

    touchGFX是一套在MCU上运行的GUI方案 本文使用的平台是mt2523 xff0c M4内核 1 xff0c 安装TouchGFX 4 8 0 msi 下载链接 xff1a http touchgfx com en try touc
  • Linux Centos下软件的安装与卸载方法

    linux下软件的安装与卸载 第一章 linux下安装软件 xff0c 如何知道软件安装位置 注 xff1a 一般的软件的默认安装目录在 usr local 或者 opt 里 xff0c 可以到那里去找找 指令名称 xff1a wherei
  • TX2系统环境镜像制作及烧写

    参考 Jetson TX2镜像刷板法 传统TX2采用JetPack刷机的方法来部署板子的环境 对于单个板子而言没有问题 但对于大批量的TX2板子 如果都采用同样的方法 重复的操作来部署系统环境 无疑是一件很费时间的事情 如果有了母板 即配置
  • 2016 CSDN最佳博客(Android)

    无意中在CSDN上看见了今年的十佳博客 xff0c 虽然现在还没有分出伯仲 xff0c 但是结果大概已知 xff0c 其中看了几篇文章 xff0c 感触挺深 xff0c 故把几大博客整理下来 xff0c 一方面方便广大博友 xff0c 另一
  • java中线程池-ThreadPoolExecutor中corePoolSize和maximumPoolSize的理解

    span class token keyword import span java span class token punctuation span io span class token punctuation span IOExcep