强制禁止,线程池不允许使用Executors创建

news2024/11/27 0:42:03

在这里插入图片描述

目录

    • 一、线程池
    • 二、线程池不允许使用Executors创建
    • 三、这是为什么呢?
    • 四、下面通过一段代码,测试一下。
    • 五、线程池参数

大家好,我是哪吒。

一、线程池

在程序开发中,高并发场景越来越多,线程池首当其冲。

简单回顾一下:

  1. 单线程池newSingleThreadExecutor(),只有一个核心线程的线程池,保证任务按FIFO顺序一个个执行;
  2. 固定线程数线程池newFixedThreadPool(10),固定数量的可复用的线程数,来执行任务。当线程数达到最大核心线程数,则加入队列等待有空闲线程时再执行;
  3. 可缓存线程池newCachedThreadPool(),创建的都是非核心线程,而且最大线程数为Interge的最大值,空闲线程存活时间是1分钟。如果有大量耗时的任务,则不适该创建方式,它只适用于生命周期短的任务;
  4. 固定线程数newScheduledThreadPool(10),支持定时和周期性任务newScheduledThreadPool(10),顾名思义,在固定线程数的前提下,添加了定时任务。

二、线程池不允许使用Executors创建

《阿里巴巴 Java 开发手册》强制禁止,线程池不允许使用Executors创建,而是通过ThreadPoolExecutor的方式创建,这样的处理方式能让编写代码的工程师更加明确线程池的运行规则,避免资源耗尽的风险。

Executors返回的线程池对象的弊端如下:

  1. FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
  2. CachedThreadPool:允许创建的线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

在这里插入图片描述

好吧,昨天,我还通过ExecutorService executorService = Executors.newFixedThreadPool(200);创建了一个线程池,看来以后要注意了。

三、这是为什么呢?

具体分析以下【说明】中的内容,以FixedThreadPool为例,允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。

也就是说,我建了一个固定长度为200的线程池,当请求超过200时,线程池会新建一个队列queue,来储存阻塞的线程,而且new LinkedBlockingQueue()是一个没有大小限制的。规约的意思是当请求过多,每个任务执行较慢时,远超线程池的大小,会全部压到这个无界Queue中,这个队列queue会扛不住,有点道理。

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

四、下面通过一段代码,测试一下。

public class ThreadPoolTest {
    public static void main(String[] args) throws IOException {
        ExecutorService executorService = Executors.newFixedThreadPool(200);
        for (int i = 0; i < 1000000; i++) {
            Thread0926 thread = new Thread0926();
            executorService.execute(thread);
        }
    }

    private static Object lock = new Object();
    public void increase() {
        synchronized (lock) {
            try {
                String content = FileUtils.readFileToString(new File("H:\\CSDN\\08Typora文章\\Java高并发\\Java高并发编程实战1,那些年学过的锁.md"));
                // 为了模拟OOM问题,歇20分钟
                TimeUnit.MINUTES.sleep(20);
            } catch (Exception e) {
            }
        }
    }
}

果然,运行一段时间后,OOM了。

[09:49:07.412] [http-nio-48135-exec-1] [ERROR].[dispatcherServlet]:175 ] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: unable to create new native thread] with root cause

java.lang.OutOfMemoryError: unable to create new native thread 

从日志可以看出,java.lang.OutOfMemoryError: unable to create new native thread ,OOM错误,无法新建本地线程。

由于代码中为了模拟OOM问题,读取一次超大文件,然后歇20分钟,也就是说会有大量的线程阻塞。

五、线程池参数

工作中,一般会根据程序的实际使用场景,评估线程池的几个重要参数:

  1. corePoolSize(线程池基本大小):当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize时,(除了利用提交新任务来创建和启动线程(按需构造),也可以通过 prestartCoreThread() 或 prestartAllCoreThreads() 方法来提前启动线程池中的基本线程。)
  2. maximumPoolSize(线程池最大大小):线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。另外,对于无界队列,可忽略该参数。
  3. keepAliveTime(线程存活保持时间)当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数。
  4. workQueue(任务队列):用于传输和保存等待执行任务的阻塞队列。
  5. threadFactory(线程工厂):用于创建新线程。threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号)。
  6. handler(线程饱和策略):当线程池和队列都满了,再加入线程会执行此策略。

设置拒绝策略,确保线程池的工作行为符合需求,一般都需要设置有界的工作队列和可控的线程数。

还有一点需要注意,当创建线程或线程池时,要指定有意义的线程名字,方便排查问题,定位错误代码位置。

上一篇:一个关于 i++ 和 ++i 的面试题打趴了所有人

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1097066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LVGL_基础控件线条line

LVGL_基础控件线条line 1、创建基础空间line&#xff08;只创建出来是没有东西显示的&#xff09; /* 创建一个 line 组件(对象)&#xff0c;他的父对象是活动屏幕对象 */ lv_obj_t * line lv_line_create(lv_scr_act());2、添加点&#xff0c;把这些点连成线 /* 设置一组…

文件路径操作

避开-转义字符 python文件路径导致的错误常常与“\”有关&#xff0c;因为在路径中的“\”常会被误认为转义字符。 所以在上述路径中&#xff0c;\table\name\rain中的\t,\n,\r都易被识别为转义字符。 解决的办法主要由以下三种&#xff1a; #1 前面加r表示不转义 pathr&quo…

南美厄瓜多尔市场最全分析开发攻略,收藏一篇就够了

2023年5月11日&#xff0c;中厄自由贸易协定签署&#xff0c;不仅标志着中国加强与拉美地区的经济合作&#xff0c;也为外贸人拓展市场提供了巨大的机会。厄瓜多尔是一个具有潜力的市场&#xff0c;其年轻的消费群体和较高的互联网普及率为外贸人提供了广阔的发展空间。今天来分…

网络安全工程师需要学什么?零基础怎么从入门到精通,看这一篇就够了

网络安全工程师需要学什么&#xff1f;零基础怎么从入门到精通&#xff0c;看这一篇就够了 我发现关于网络安全的学习路线网上有非常多看似高大上却无任何参考意义的回答。大多数的路线都是给了一个大概的框架&#xff0c;告诉你那些东西要考&#xff0c;以及建议了一个学习顺…

超高度近视+白内障,爱尔眼科周进院长助患者视界“焕新”

57岁的徐女士自幼就是高度近视并开始戴眼镜&#xff0c;且近视度数逐年增加&#xff0c;很快便发展成了2000多度的超高度近视&#xff0c;最终在爱尔眼科四川眼科周进院长的帮助下&#xff0c;一次手术同时解决了高度近视和白内障的问题&#xff0c;视力得以改善&#xff0c;50…

Notepad ++ 零基础入门到精通安装与配置教程(非常详细)

Notepad 获取与安装 —————————— Notepad 是什么 在运行中输入 notepad 会弹出来记事本&#xff1a; 所以 Notepad 就是增强的记事本&#xff01;这个跟 C 与 C 的名字是一样滴&#xff01; Notepad 是 Windows 操作系统下的一套文本编辑器 软件版权许可证 GPL有…

css 左右滚轮无缝衔接

最近的项目有做到一个功能 类似跑马灯或者公告栏那种 有文字 也有列表的 所以 写了两种 第一种公告栏文字是用的js 第二种图文类型是用的css 两种方法 记录一下 第一种 纯文字滚动 其实也是根据js去计算dom的宽度 通过js去给css赋值 <div class"div1"><div …

Python抽奖系统-----控制台显示

以下是一个 Python 抽奖系统&#xff0c;其中包含更多的功能&#xff0c;如添加参与者、多轮抽奖、保存获奖者名单等&#xff1a; import random import osdef load_participants():try:with open("participants.txt", "r") as file:participants file.r…

Makefile——Linux下C/C++编译方法

目录 1. C1.1 编译C1.2 创建静态库1.3 创建动态库 2. C3. Makefile3.1 变量3.2 常用函数3.3 makefile编译文件 1. C linux下常见的C语言项目相关的文件如下图所示。 1.1 编译C 通常使用GCC来编译C文件。编译过程为源文件.c文件 -> 预编译成.i文件 -> 编译成汇编语言.…

【mfc/VS2022】计图实验:绘图工具设计知识笔记2

按钮添加处理程序 1.类视图找到对应类右击&#xff0c;类向导 2. 找到对应的的按钮id 如何将画出的两个相交的圆都显示出来&#xff0c;而不是重叠&#xff08;如下图&#xff09;隐藏了一条圆弧 问题如图&#xff1a; 因为矩形和圆心其实是个背景色的封闭图形&#xff0c;所…

ggplot2 -- geom_linerange 函数的简单使用

brief 需要三个参数确定一个直线&#xff0c;x轴位置&#xff0c;y轴起始位置&#xff0c;y轴结束位置。 有别于一些垂直辅助线&#xff0c;可以实现柱状图&#xff0c;瓷砖图等等。 example 实现柱状图 library(tidyverse)tibble(theta seq(from 0, to 1, by .1),prio…

【一周安全资讯1014】交通运输部发布《公路工程设施支持自动驾驶技术指南》;多地网信办对违反数据安全法规企业作出行政处罚

要闻速览 1.交通运输部发布《公路工程设施支持自动驾驶技术指南》 2.数据泄漏被传输境外后擅自删库&#xff01;某科技公司被上海市网信办依法处罚 3.浙江省网信办对杭州某科技公司未履行数据安全保护义务依法作出行政处罚 4.超140亿元资金失窃&#xff1f;印度一支付网关服务…

【Java】HIS医院信息化管理系统源码(SaaS模式多医院)

【Java】HIS医院信息化管理系统源码&#xff08;SaaS应用&#xff09;&#xff0c;系统采用主流成熟技术开发&#xff0c;B/S架构&#xff0c;软件结构简洁、代码规范易阅读&#xff0c;SaaS应用&#xff0c;全浏览器访问&#xff0c;前后端分离&#xff0c;多服务协同&#xf…

百度智能云-身份证验证(完整版-直接用)

百度云网址: https://cloud.baidu.com 身份验证的技术文档: 技术代码: 导入依赖: <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.12.13</version><scope>compile<…

操作系统学习——进程调度

三种不同的调度 进程调度的两种基本方式 非剥夺方式&#xff1a;一旦吧处理机分配给某个进程后&#xff0c;便让他一直运行&#xff0c;知道进程完成或者发生某事件而阻塞&#xff0c;才把处理机转给另一个进程。 剥夺方式&#xff1a;某个进程运行时&#xff0c;如果有中断或…

flutter app开发环境搭建

Flutter是一个跨终端、多设备的应用界面开发工具&#xff0c;其支持web端、移动端、桌面端以及嵌入式不同应用场景的应用开发&#xff0c;其使用dart语言作为开发语言&#xff0c;本文主要描述Flutter开发环境搭建。 如上所示&#xff0c;从Flutter官方网站下载最新版本的Flutt…

AP8851H 降压恒压DC电源芯片 5V12V 零功耗快充应用

1&#xff0c;产品描述 AP8851H 一款宽电压范围降压型 DC-DC 电源管理芯片&#xff0c;内部集成使能 开关控制、基准电源、误差放大器、过 热保护、限流保护、短路保护等功能&#xff0c; 非常适合在宽输入电压范围具有优良 的负载和线性调整度。 AP8851H 芯片包含每周期的峰值…

iOS开发- CMMotionManager 开发

文章目录 一、CMMotionManager1.1 push方式1.2pull 方式 二、设备运动类型1. attitude2. rotationRate3. gravity4. userAcceleration5. magneticField & heading iOS 中常见传感器如下所示: 类型作用环境光传感器感应光照强度距离传感器感应靠近设备屏幕的物体磁力计传感器…

千兆光模块和万兆光模块的适用场景有哪些

随着数字化和物联网的普及&#xff0c;对网络速度和带宽的要求也越来越高。千兆光模块和万兆光模块是两种常见的光模块&#xff0c;在不同的应用场景中&#xff0c;它们各具优势。下面我们来探讨一下千兆光模块和万兆光模块的主要适用场景。 首先是企业网络。千兆光模块常用于…

环形海尔贝克Halbach磁体阵列

环形海尔贝克阵列是一种特殊形状的磁体结构&#xff0c;它的设计思路是通过将形状相同磁化方向不同的多个磁体组合而成一个圆环形磁体&#xff0c;以增强工作面或中心磁场的均匀性和稳定性。使用Halbach阵列结构的永磁电机较传统永磁电机具有更接近正弦分布的气隙磁场&#xff…