线程池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使用 的相关文章

  • 如何使用javac编译java包结构

    我正在尝试编译 从命令行 一个 java 包 该包导入我自己的另一个包 我正在关注一个在线教程 http www roseindia net java master java createsubpackage shtml但当我尝试编译最终的
  • JDT - 尝试更改类型的超类。我不知道超级类的限定名称

    我有一个程序 除其他任务外 还必须使用 JDT 更改某些类的超类 我有两个字符串 其中包含要交换的超类的限定名称 例如 org example John 和 org example Smith 并且我正在解析整个 AST 搜索扩展这些类的类
  • 如何修复安装 maven jar 插件依赖项时出现的错误?

    我正在将应用程序制作成 maven 中的 jar 文件 但是 当我从 Maven 中提取 jar 插件存储库并在终端中运行这三个命令时 mvn clean mvn compile mvn package 在 mvn package 中 我收
  • 方法重载。你能过度使用它吗?

    当定义多个使用不同过滤器返回相同形状的数据的方法时 什么是更好的做法 显式方法名称或重载方法 例如 如果我有一些产品并且我正在从数据库中提取 显式方式 public List
  • cygwin有java sdk吗?

    cygwin有java sdk吗 如果有一个使用 cygwin 文件系统和 X windows 进行显示的本机 cygwin 实现 那就太好了 不幸的是我不知道这样的版本 我认为移植 OpenJDK 也需要付出很大的努力 但我还没有尝试过
  • 将倒计时器从 10 秒改为 1 秒

    我有一个倒计时器 它以 1 秒的增量从 10000 毫秒倒计时到 0 毫秒 以使按钮在 10 秒后可单击 尽管计时器是准确的并且按照代码的说明执行操作 但我想更改秒的表示方式 但我不知道如何更改 java void startTimer c
  • Java 8 中异常类型推断的一个独特功能

    在为该网站上的另一个答案编写代码时 我遇到了这个特性 static void testSneaky final Exception e new Exception sneakyThrow e no problems here nonSnea
  • Guice:当 FactoryBuilder 中提供合适的构造函数时,“找不到合适的构造函数”

    我使用 Guice 进行依赖注入 但收到此错误 1 Could not find a suitable constructor in java lang Void Classes must have either one and only
  • 如何将点击侦听器添加到 Android/Java Textview 中的字符串中?

    我想要完成的是大多数 Twitter 应用程序中的标准操作 在文本视图中 文本字符串中的单词前面可能有 提及或 主题标签 并且它们实际上能够添加点击侦听器这个词启动了另一项活动 有谁知道这是如何实现的 下面我附上了一张示例照片 显示了我想要
  • 在仔细锁定但不受信任的代码上使用 Thread.stop()

    我知道Thread stop 已被弃用 并且有充分的理由 它通常不安全 但这并不意味着它是never安全 据我所知 在我想要使用它的上下文中它是安全的 而且 据我所知 我别无选择 上下文是一个两人策略游戏的第三方插件 以国际象棋为例 第三方
  • SQLite 64位整数在jooq中被识别为int

    我有一个与 jOOQ 一起使用的 SQLite 数据库 当我使用 jOOQ 的代码生成工具时 它会按预期构建所有表和记录类 然而 所有的 SQLiteINTEGER列变成java lang Integer生成的代码中的字段 问题是 SQLi
  • 检查对象是否为空

    我有一个链表 其中第一个节点包含空对象 表示firstNode data等于null firstNode nextPointer null firstNode previousPointer null 我想检查firstNode 是否为空
  • Spring Boot - 如何在开发过程中禁用@Cacheable?

    我正在寻找两件事 如何在开发过程中使用 Spring boot dev 配置文件禁用所有缓存 application properties 中似乎没有通用设置可以将其全部关闭 最简单的方法是什么 如何禁用特定方法的缓存 我尝试像这样使用 S
  • 如何保存/加载 BigInteger 数组

    我想保存 加载BigInteger数组传入 传出 SharedPreferences 如何做呢 例如对于以下数组 private BigInteger dataCreatedTimes new BigInteger 20 Using Gso
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • 如何将 .txt 文件的最后 5 行读入 java

    我有一个包含多个条目的文本文件 例如 hello there my name is JoeBloggs 我如何按降序阅读最后五个条目 即来自 JoeBloggs 那里 我目前有代码只能读取最后一行 public class TestLast
  • 在Java中,为什么某些变量首先需要初始化,而其他变量只需要声明?

    我试图更深入地理解我是否遗漏了一些关于 Java 何时需要变量初始化与简单声明的理解 在以下代码中 不需要为变量 row 赋值即可编译和运行 但变量 column 则需要赋值 注意 该程序没有任何用处 它已被修剪为仅显示此问题所需的内容 以
  • 如何强制 Spark 执行代码?

    我如何强制 Spark 执行对 map 的调用 即使它认为由于其惰性求值而不需要执行它 我试过把cache 与地图调用 但这仍然没有解决问题 我的地图方法实际上将结果上传到 HDFS 所以 它并非无用 但 Spark 认为它是无用的 简短回
  • 我的代码线程不安全吗?

    我编写了代码来理解 CyclicBarrier 我的应用程序模拟选举 每轮选出得票少的候选人 该候选人从竞争中淘汰以获得胜利 source class ElectoralCommission public volatile boolean
  • 如何在 VSCode 中热重载 Tomcat 服务器

    我正在从 Eclipse IDE VSCode 分别用于编码 Java servlet 和 HTML CSS JS 网页 迁移到仅使用 Visual Studio Code 因为它的轻量级 我为 VSCode 安装了几个 Java 扩展 R

随机推荐

  • 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