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的理解 的相关文章

随机推荐

  • 解决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