java线程池优化,不再使用Executors创建线程池

【JAVA】40. Executors工具类与线程池最佳实践 Executors是 Java 中一个用于创建线程池的工具类,它提供了一系列静态方法来创建不同类型的线程池,简化了线程池的创建过程。这些方法返回的线程池实现类都是基于或。 阅读详情

今天在使用之前的线程池工具的时候,阿里的代码规范插件提示不要这样创建线程池。看了插件做出的说明决定将线程池工具改为如下:


import com.google.common.util.concurrent.ThreadFactoryBuilder;

import java.util.concurrent.*;

/**
 *
 * 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors各个方法的弊端:
 * 1)newFixedThreadPool和newSingleThreadExecutor:
 *   主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
 * 2)newCachedThreadPool和newScheduledThreadPool:
 *   主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
 * @author wangjie
 */
public class ThreadPoolUtil {

    private  volatile static ExecutorService executorService;
    private ThreadPoolUtil(){}
    public static ExecutorService getExecutorService() {

       if (executorService == null) {
            synchronized (ThreadPoolUtil.class) {
                /**
                 * 使用谷歌的guava框架
                 * ThreadPoolExecutor参数解释
                 *   1.corePoolSize 核心线程池大小
                 *   2.maximumPoolSize 线程池最大容量大小
                 *   3.keepAliveTime 线程池空闲时,线程存活的时间
                 *   4.TimeUnit 时间单位
                 *   5.ThreadFactory 线程工厂
                 *   6.BlockingQueue任务队列
                 *   7.RejectedExecutionHandler 线程拒绝策略
                 */
                ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
                executorService = new ThreadPoolExecutor(10, 20,
                        0L, TimeUnit.MILLISECONDS,
                        new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());

            }
        }
        return executorService;
    }
}

其中,使用ThreadFactoryBuilder需要用到谷歌的guava框架,maven依赖为:

		<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>26.0-jre</version>
        </dependency>

另外,spring也提供了相似的工具

  public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
        // 设置核心线程数
        threadPool.setCorePoolSize(5);
        // 设置最大线程数
        threadPool.setMaxPoolSize(10);
        // 线程池所使用的缓冲队列
        threadPool.setQueueCapacity(25);
        // 设置线程活跃时间(秒)
        threadPool.setKeepAliveSeconds(60);
        // 等待所有任务结束后再关闭线程池
        threadPool.setWaitForTasksToCompleteOnShutdown(true);
        // 线程名称前缀
        threadPool.setThreadNamePrefix(blockChainExecer);
        // 初始化线程
        threadPool.initialize();
        return threadPool;
    }
Executors线程池创建方式及线程核心参数配置 系列文章目录 文章目录系列文章目录前言一、Executors常用的线程池类型二、线程池中队列常用类型三、线程池原理、以及核心参数四、线程池的拒绝策略五、java实现创建线程池总结 前言 为什么要用线程池,因为“池”的思想就是以空间换时间,就像数据库连接池一样,好处就是:1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 提示:以下是本篇文章正文内容,下面案例可供参 阅读详情

相关推荐

springboot3 ThreadPoolTaskExecutor 和 Executors 线程池优化

在 Spring Boot 3 中,可以通过 ThreadPoolTaskExecutor 和 Executors 等方式创建和管理线程池。

空 1245

阿里规范 不要显式创建线程,请使用线程池以及手动创建线程池,效果会更好哦

idea阿里规范 不要显式创建线程,请使用线程池以及手动创建线程池,效果会更好哦的处理

qq_45235979的博客 5668

ANSYS Fluent热边界条件避坑指南:为什么你的自然对流计算结果总出错?

本文深入剖析了在ANSYS Fluent中进行自然对流仿真时,导致计算结果出错或发散的核心原因与解决方案。重点解析了重力项与操作密度设置、Boussinesq与不可压缩理想气体模型的抉择、以及压力离散格式(推荐Body Force Weighted)这三大关键雷区,并结合电子机箱散热等实战案例,提供了一套稳定可靠的仿真设置流程与调试技巧。

weixin_28396629的博客 741

Java 线程池

线程池规范 阿里巴巴 Java 开发手册对线程池的规范定义 即不要按照以下方式创建线程: Thread thread = new Thread(new Runnable() { @Override public void run() { // do something by a thread } }); 如果在 IntelliJ IDEA 中安装了 Al...

Jake Weng 2191

[信号与系统]一阶与二阶连续时间系统和离散时间系统

定义:一阶连续时间系统由一阶线性常系数微分方程描述: dy(t)dt+ay(t)=bx(t) \frac{dy(t)}{dt} + a y(t) = b x(t) dtdy(t)​+ay(t)=bx(t)时间常数:时间常数 τ=1a\tau = \frac{1}{a}τ=a1​ 是系统响应速度的衡量指标。时间常数越小,系统响应越快。冲激响应:一阶系统的冲激响应是指数衰减或增长的形式。例如,对于一个单位冲激输入,响应为: h(t)=bae−at h(t) = \frac{b}{a} e^{-at} h(t)=

Andius的博客 2122

华硕ROG枪神双系统实战:Ubuntu安装避坑指南

本文是华硕ROG枪神笔记本安装Ubuntu双系统的详细避坑指南。针对其独特的硬件与BIOS设计,文章核心解决了VMD控制器导致硬盘无法识别、驱动兼容性等关键难题,并提供了从BIOS设置、分区方案到安装后驱动配置与性能调优的一站式解决方案,帮助用户实现稳定的双系统体验。

raspberrypi5的博客 545

请使用线程池创建线程,而勿手动创建线程

在中大型项目中,不可避免地需要执行异步任务,而异步任务的执行则是通过线程而执行的,因此掌握线程是如何创建的则是执行异步任务的第一步。 我们知道,常见的创建线程的方式有: 继承Thread类,重写run()方法 实现Runnable接口,重写run()方法 使用线程池创建线程 一、继承Thread类 public class ThreadOne extends Thread { @Override public void run() { System.out.printl

当冬夜渐暖的博客 3764

FREERTOS+LWIP+IAP实现TCP、HTTP、网页访问并固件升级、更新配置 (三)lwip实现httpd服务并在web访问

在前两篇文章中配置freeRTOS和,并实现了TCP、UDP的通信协议,现在终于轮到重头戏lwip的httpd服务,LWIP官方例程中是有很多自带的网页的,但是远远不够满足实际项目的使用需求,因此我也是踩了很多坑,从前端网页制作,到网络通信的实现,到后端数据处理,从头开始学起,也是学习到了很多没接触过的东西,本章将搭建LWIP的HTTP服务使得浏览器可以访问WEB。

wangjiaheng0716的博客 2965

多线程基础介绍第一篇

一、多线程是什么?为什么要用多线程?   介绍多线程之前要介绍线程,介绍线程则离不开进程。   首先 进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元;   线程:就是进程中的一个独立控制单元,线程在控制着进程的执行。一个进程中至少有一个进程。 多线程:一个进程中不只有一个线程。   为什么要...

落尘的博客 578

【文献阅读笔记】之基于注意力机制的深度学习路面裂缝检测

中文,计算机辅助设计与图形学学报,第 32 卷 第 8 期,2020 年 8 月。 DOI: 10.3724/SP.J.1089.2020.18059 摘要: 为实现自动准确地检测路面裂缝, 提升路面裂缝检测效果, 提出了一种基于注意力机制的裂缝检测网络 (attention-based crack networks, ACNet). 该网络采用编码器-解码器网络构架, 编码器采用 ResNet34 为骨干网, 提取路面裂缝特征; 在编码器和解码器间加入基于注意力机制的特征模块(attention-b

qq_44785998的博客 7593

实战复盘:如何用ATE(自动测试设备)搞定一颗MCU的功能测试全流程

本文详细解析了如何利用ATE(自动测试设备)完成MCU功能测试的全流程,涵盖测试需求分析、测试向量生成、ATE测试程序开发及调试实战。通过真实案例分享,帮助工程师高效解决芯片测试中的常见问题,提升Functional Test的准确性和效率。

weixin_30872157的博客 485

多线程中的Join

线程中join(强制执行):当前线程执行完毕之后,才会执行后面程序,其他线程阻塞; 实例: public class ThreadJoin implements Runnable{ @Override public void run() { for (int i = 1; i < 1000; i++) { System.out.println("Join..."+i+"运行中"); } } public stat

柯基的博客 3203

人群仿真软件:AnyLogic_(12).AnyLogic高级功能应用

在AnyLogic中,自定义行人行为是通过编写Java代码来实现的。行人行为的自定义可以包括行走路径的选择、速度变化、交互行为等。这使得仿真模型更加灵活和真实。

kkchenjj的博客 1061

如何优雅的自定义 ThreadPoolExecutor 线程池

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析...

weixin_44421461的博客 314

基于YOLOv11的仓库机器人导航系统设计与实现:Amazon Robotics Challenge解决方案

本文将详细介绍一个基于YOLOv11目标检测算法的仓库机器人导航系统,该系统能够准确识别托盘(pallet)和箱子(box),为机器人提供精确的导航信息。而基于深度学习的视觉导航系统能够实时识别环境中的关键物体,如托盘和箱子,从而实现更智能的路径规划和货物搬运。YOLOv11作为YOLO系列的最新演进版本,在检测精度和速度上都有显著提升,非常适合仓储环境中的实时物体检测任务。YOLOv11在保持实时性的同时,提高了对小物体和密集物体的检测能力,这对仓储环境中的托盘和箱子检测尤为重要。

YOLO 303

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

自定义 ThreadPoolExecutor 线程池

如何才是最优雅的方式去使用过线程池吗?生产环境要怎么去配置自己的线程池才是合理的呢?需要对症下药,建立自己的线程工厂类,灵活设置关键参数。

weixin_37799575的博客 822

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

优雅的自定义 ThreadPoolExecutor 线程池

java 中经常需要,非常使用或者的方式来,那样。同时,这个时候。java 中涉及到线程池的相关类均在开始的包中,涉及到的几个核心类及接口包括:的几种方式都封装在中:newFixedThreadPool 设置了,,,可以,当newSingleThreadExector 基本,但是,,newCachedThreadPool ,同步移交队列,也就是说,,也,会,由于newScheduledThreadPool 支持,注意一下,那么上面说了使用Executors工具类创建的线程池有隐患,那如何使用才能避免这个隐患

qq_40813329的博客 650

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

为什么建议不要使用Executors来创建线程池?

可以设置更有意义的线程名称,方便问题追踪和调试。

double222222的博客 1634

Java为什么不建议使用Executors来创建线程池呢?

我们先来看看 Executors 当中的几个方法,也就是上面了不起给大家写的除了自定义线程池的几个方法。在源码中有一个类,我们明显的看到了队列的身影,那就是 LinkedBlockingQueue。它实现了一个基于链接节点的可选容量的阻塞队列。此队列按 FIFO(先进先出)排序元素。队列的头部是在队列中存在时间最长的元素,队列的尾部是在队列中存在时间最短的元素。新元素总是插入到队列的尾部,而检索操作(如 take 和 poll)总是从队列的头部开始。

Wewe的博客 1128

为什么阿里Java规约禁止使用Java内置Executors创建线程池?

IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒。 告诉你手动创建线程池,效果会更好。 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有哪些参数及其意义。 ThreadPoolExecutor 构造方法: 复制代码 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue w

qq_33240556的博客 2262

为什么阿里巴巴Java开发手册禁止使用Executors创建线程池?

阿里巴巴Java开发手册》禁止使用Executors创建线程池的规定并非过度谨慎,而是基于大量生产实践经验总结出的宝贵教训。通过手动创建ThreadPoolExecutor,我们能够明确控制线程数量上限和任务队列容量,有效防止资源耗尽导致的系统崩溃。在高并发场景下,线程池配置不当引发的问题往往具有突发性和灾难性,可能在系统长期稳定运行后的某个峰值时刻突然爆发。正确的做法是遵循"自定义线程池参数、限制资源上限、设置拒绝策略、加强监控告警"的原则,根据业务特性精细调整线程池配置。

学Java,找哪吒 1043

Java 中使用 Executors 工具类创建线程池的潜在问题

Executors 工具类虽然便捷,但其预设的线程池参数(如无界队列、无限制线程数)容易引发生产环境中的严重问题。手动创建线程池是更可靠的选择,开发者需根据业务负载、资源限制和容错需求,精细配置核心参数、队列类型及拒绝策略,并结合监控实现动态调优。

qq_40453972的博客 1069

使用Executors类创建线程池的弊端以及与使用ThreadPoolExecutor类的区别

介绍: 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。 为什么要使用线程池? 这里借用《Java并发编程的艺术》提到的来说一下使用线程池的好处: 降低资源消耗。 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。 线程是稀缺资源,如...

SmallCarrot的博客 4520

Java Executors工具类:线程池管理与优化

在当今的软件开发领域,高并发已经成为一个不可忽视的关键问题。尤其是在处理大量用户请求或执行耗时任务时,如何有效地管理线程资源,提高系统的响应速度和吞吐量,成为了开发者必须面对的挑战。Java语言提供了丰富的并发工具,其中,Executors工具类作为Java并发编程的重要组成部分,其重要性不言而喻。它能够帮助我们轻松地创建和管理线程池,从而简化并发编程的复杂性。在实际开发中,我们经常会遇到需要处理大量并发请求的场景,如在线购物平台、社交网络等。

我是Java程序员廖志伟,感谢朋友们的支持! 1084
上一篇: WebMvcConfigurationSupport、WebMvcConfigurerAdapter、WebMvcConfigurer
下一篇: lambda表达式之CompletableFuture
more_try
博客等级 码龄11年 13粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值