线程池newCachedThreadPool使用

2023-10-30

1.查看newCachedThreadPool线程池创建方法
创建线程池:

Executor cachedThread = Executors.newFixedThreadPool(1);

查看底层实现:

public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}

通过源码得出newCachedThreadPool的初始核心数是0最大核心数是使用的是 Integer.MAX_VALUE,SynchronousQueue是为队列。

2.使用ThreadPoolExecutor模拟newCachedThreadPool
public static void main(String[] args) {
int corePoolSize = 0;
int maximumPoolSize = Integer.MAX_VALUE;
long keepAliveTime = 60L;
SynchronousQueue syncQueue = new SynchronousQueue();
Executor cachedThread = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime, TimeUnit.SECONDS,
syncQueue);

    for (int i = 0; i < 50000; i++) {
        cachedThread.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        });
    }
}

3.执行查询系统资源占用情况

从图中可以看出CPU占用非常厉害,可能会导致机器卡死。

将程序改一下:

运行得出的参数:

可以看到workQueue的值一直是0,跑了10次worker数据为10

4、修改maximumPoolSize参数值为5

现执行程序

for (int i = 0; i < 50000; i++) {
cachedThread.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}

执行结果:

从图中结果可以看出再执行到第5的时候就出现异常了。

再修改程序:每执行5个线程睡眠0.1秒

for (int i = 0; i < 50000; i++) {
//每执行5个线程睡眠0.1秒
if(i%5 == 0){
try {
System.out.println(“睡眠i==” +i);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
cachedThread.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}

执行结果:顺利完成且没有任何异常

5.结论
1.newCachedThreadPool最大的核心是int的最大值,如果有业务会在核心数内一直创建线程,导致CPU占用非常的高。
2.SynchronousQueue在此仅用于阻塞,不会进行何的缓存。
3.当创建的线程在业务未完成前,如果已达到最大核心数则不能再创建线程,如果再继续创建则会抛出异常。当可能worker有空的时候可以再次执行业为。可以看出有点像生产者消费模式,如果消费不及时者会不再继续生产,如果继续生产会导致失败。

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

线程池newCachedThreadPool使用 的相关文章

随机推荐

  • hack the box - tier0

    Tier0 Meow Recommended Academy Modules INTRO TO ACADEMY STARTING POINT Tier 0 Machines Tags Enumeration Telnet External
  • 嵌入式linux解决方法

    一 问题描述 u boot version 2016 03 ubuntu version 18 04 ubuntu中环境配置正确 通过其他客户端能够挂载上 但是使用uboot得nfs下载命令会报错 gt nfs 80800000 192 1
  • CSS中表格以及表单的属性以及运用

    一 表格 按照一定的顺序摆放数据 表格是由一些单元格组成 1属性 border边框 cellspacing 单元格与单元格之间的距离 cell padding 单元格 边框和内容之间的距离 align 表格水平的位置 tr行 align 调
  • 并发编程NO.2

    并发编程 共享模型之管程 4 1共享资源问题 临界区 一个程序运行多个线程本身是没问题的 问题出在多个线程访问共享资源 多个线程读共享资源没有问题 但是多线程对共享资源进行读写操作 就会有问题 一段代码内如果存在对共享资源的多线程读写操作
  • leetcode 2. 两数相加

    2023 9 14 这道题还是有点难度 需要维护一个进位值 构造一个虚拟头节点dummy 用于结果的返回 还要构造一个当前节点cur 用于遍历修改新链表 整体思路就是长度短的链表需要补0 然后两链表从头开始遍历相加 要考虑进位 需要注意的点
  • [PHP] CURL获取cookie,模拟登录获取数据

    需求 通过CURL先登录 然后获取登录后的cookie 在请求数据接口的时候带上这个cookie即可 直接贴代码 1
  • 决策树分箱-特征工程之数据离散化处理-基于python实现

    一 简介 离散化是通过创建一组跨越变量值范围的连续区间将连续变量转换为离散变量的过程 1 1 离散化有助于处理异常值和高度偏斜的变量 离散化通过将这些值 与分布的剩余内点值一起放入较低或较高的区间来帮助处理异常值 因此 这些异常值观察不再与
  • rosbag与csv等格式转换

    1 rosbag 转换成csv 参看 https blog csdn net cliukai article details 94554350 具体就是 rostopic echo b
  • Cocos Creator 用JS脚本实现游戏背景的无限滚动

    首先是实现的一个原理 使用2张相同的图片 让它们在脚本中不停的移动 用y值的减少来实现 当有图片离开场景时 给此图片的y重新赋值 相当于位置的重置 在update中无限调用背景移动的函数 我的canvas 位于上方的图片结点名称为BG 下方
  • 迷宫游戏源码

    mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include MAZE h include
  • 【leetcode每日一题】479. 最大回文数乘积

    最大回文数乘积 题目来源 题意 思路 代码 注意 题目来源 点这里 题意 给定一个整数 n 返回可表示为两个 n 位整数乘积的最大回文整数 因为答案可能非常大 所以返回它对 1337 取余 思路 开始刷leetcode每日一题的Day3 我
  • openGL之API学习(四十五)正向渲染和延迟渲染

    如果你是一个游戏开发者 在你使用的图形引擎中或多或少都听说过forward rendering和deferred rendering 通常你必须在你的游戏中选择一种 但它们是什么 彼此之间有什么不同 我们又该如何选择呢 Modern Gra
  • DGA - 研究内容整理

    20200809 引言 DGA算法是一种生成域名的算法 以时间或者一些特定字符串作为种子 然后利用一定的算法 例如加密算法 来生成随机域名的方式 恶意软件的制作者通过这种方式来迷惑安全工作者 传统的恶意软件利用硬编码的方式将CC域名保存在程
  • qt正则表达式类QRegExp

    QRegExp是Qt的正则表达式类Qt中有两个不同类的正则表达式 第一类为元字符 它表示一个或多个常量表达式 令一类为 转义字符 它代表一个特殊字符 一 元字符 匹配任意单个字符 例如 1 3 可能是1 后面跟任意字符 再跟3 匹配字符串首
  • 12对胸椎对应体表标志_「康复基础」脊柱各结构的体表定位方法

    棘突的触抹定位法 1 颈椎 常利用枕外粗隆 C2 C7棘突 来确定颈椎各棘突的位置 枕外粗隆 粗大 任何人均可准确触抹清 沿此向下 有一凹陷 再向下推摸 可触及一骨突 即为C2棘突 C2棘突 较大 末端分叉 瘦弱者低头时可见其隆起于项部的上
  • 只用2GB的内存找出20亿个整数中找到出现次数最多的数

    要求有一个包含20亿个32位整数的文件 从中找到出现次数最多的数 首先先分析一下 32位int类型的数占4B 20亿个4B 约为 8GB 只用2GB肯定不够 所以我们肯定需要将这20亿个数哈希到不同的文件中 由于哈希函数的特性 对于相同的输
  • (已解决)关键词爬取百度搜索结果,返回百度安全验证,网络不给力,请稍后重试,无法请求到正确数据的问题(2023最新)

    已解决 使用关键词进行百度搜索 然后爬取搜索结果 请求数据后 返回的是百度安全验证 网络不给力 请稍后重试 无法请求到正确数据 且尝试在header中增加Accept参数还是不行 一 问题产生的现象 在学习过程中 写了一小段练习用的爬取程序
  • PyQt5 使用 pyinstaller打包文件(speed)

    编写界面 import sys math from PyQt5 QtWidgets import from PyQt5 QtCore import Qt from PyQt5 QtGui import class RightBottomBu
  • Android中引入开源库(Eclipse与Android Studio)

    以GitHub上的SlidingMenu为例 下载地址 jfeinstein10 SlidingMenu 一 Eclipse中引入 1 Import gt Existing Android Code Into Workspace 选择导入文
  • 线程池newCachedThreadPool使用

    1 查看newCachedThreadPool线程池创建方法 创建线程池 Executor cachedThread Executors newFixedThreadPool 1 查看底层实现 public static ExecutorS