Java 线程池规范

目录

    • 1、为什么要使用线程池?
    • 2、线程池如何命名
    • 3、不要使用 Executors 下自带线程池
    • 4、@Async 正确用法
    • 5、项目中可以定义多个线程池吗?

1、为什么要使用线程池?

在使用多线程时,频繁地创建和销毁线程会带来显著的性能开销。使用线程池可以避免这种开销,并提供了以下优点:

  • 重用线程:线程池会维护一组可重用的线程,避免了频繁地创建和销毁线程的开销。
  • 控制并发度:线程池允许我们限制并发执行任务的数量,避免系统过载和资源耗尽。
  • 任务排队:线程池提供了任务队列,可以将任务安排在队列中,并按照指定的调度策略顺序执行。
  • 统一管理:线程池提供了统一的管理和监控接口,可以方便地管理线程的生命周期和执行状态。

2、线程池如何命名

在线程池中,给线程命名是一项良好的实践,有助于追踪和排查问题。通过为每个线程设置有意义的名称,可以快速定位具体的任务或线程,并进行更有效的日志追踪,可以根据自己公司对线程池的规范来命名。

Java中的线程池通常使用ThreadPoolExecutor类来创建和管理。可通过ThreadFactory参数自定义创建线程的工厂,进而实现为线程设置名称。下面是一个示例:

public static void main(String[] args) {// 工单线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(5, // 核心线程数10, // 最大线程数1, TimeUnit.MINUTES, // 线程空闲超时时间new LinkedBlockingQueue<>(2000), // 等待队列new ThreadFactory() {private final AtomicInteger poolNumber = new AtomicInteger(1);private final AtomicInteger threadNumber = new AtomicInteger(1);private final ThreadGroup group = new ThreadGroup("OrderThreadPool-" + poolNumber.getAndIncrement());@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(group, r, group.getName()+"-Thread-" + threadNumber.getAndIncrement());return t;}});for(int i=0;i<7;i++){executor.execute(() -> {System.out.println(Thread.currentThread().getName());// 具体的任务代码});}}

打印:

OrderThreadPool-1-Thread-1
OrderThreadPool-1-Thread-5
OrderThreadPool-1-Thread-4
OrderThreadPool-1-Thread-2
OrderThreadPool-1-Thread-3
OrderThreadPool-1-Thread-5
OrderThreadPool-1-Thread-1

3、不要使用 Executors 下自带线程池

Java并发库(JUC)提供了几个预定义的线程池,如Executors.newFixedThreadPool()、Executors.newSingleThreadExecutor()等。虽然这些线程池在简单场景下很方便,但在某些情况下,它们可能会引发性能问题。

这些预定义的线程池具有一些缺点:

  • 固定大小线程池:newFixedThreadPool()和newSingleThreadExecutor()创建的线程池大小是固定的,线程数不会根据需要进行调整,可能会导致线程资源的浪费或不足。
  • 使用无界队列:newFixedThreadPool()和newCachedThreadPool()使用无界队列来存储等待执行的任务,如果任务提交速度超过处理速度,可能会导致内存溢出。
  • 使用默认线程工厂和异常处理器:上述线程池使用默认的线程工厂和异常处理器,可能无法满足特定需求,如自定义线程名称、处理异常等。

因此,在实际开发中,尽量避免使用Executors自带的四个线程池,而是根据需求手动创建ThreadPoolExecutor,以便更好地管理和配置线程池。

4、@Async 正确用法

在Spring Boot中,@Async注解基于动态代理,如果不指定要使用的线程池,会默认使用Spring Boot提供的线程池,并且没有等待队列的限制,这可能导致等待队列无限大导致OOM,因此需要声明一个线程池。

首先,在Spring配置类上添加@EnableAsync注解,以启用异步方法的支持:

@Configuration
@EnableAsync
public class AppConfig {// 配置其他的Bean或组件
}

接下来,创建一个线程池的配置类,用来配置自定义的线程池:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration
public class ExecutorConfig implements AsyncConfigurer {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10); // 核心线程数executor.setMaxPoolSize(20); // 最大线程数executor.setQueueCapacity(50); // 等待队列大小executor.setThreadNamePrefix("MyAsyncThread-"); // 线程名前缀executor.initialize();return executor;}}

最后,在需要异步执行的方法上添加@Async注解,并指定要使用的线程池名称:

@Service
public class MyService {@Async("taskExecutor")public void asyncMethod() {// 异步方法的具体实现}
}

5、项目中可以定义多个线程池吗?

可以,一般项目中会用到多个线程池,根据不同业务定义不同线程池,可以通过 static 或者交给 spring 管理都是可以的。

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

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

相关文章

论文 辅助笔记:t2vec train.py

1 train 1.1 加载training和validation数据 def train(args):logging.basicConfig(filenameos.path.join(args.data, "training.log"), levellogging.INFO)设置了日志的基本配置。将日志信息保存到名为 "training.log" 的文件中日志的级别被设置为 INFO&…

iZotope Ozone 11 Advanced for mac(臭氧11)11.0.0激活版

iZotope Ozone 11是一款功能丰富的母带处理工具&#xff0c;也是混音师和母带工程师工作中必备的工具之一。它能够满足母带的全部流程&#xff0c;包括均衡器&#xff08;EQ&#xff09;、压缩器&#xff08;Comp&#xff09;、限制器&#xff08;Limiter&#xff09;、多段宽度…

DQN强化学习

算是自己写的第一个强化学习环境&#xff0c;目前还有很多纰漏&#xff0c;逐步改进ing。 希望能在两周内施工完成。 import numpy as np import torch import torch.nn as nn import torch.optim as optim import random from collections import deque import matplotlib.pyp…

[100天算法】-二叉树剪枝(day 48)

题目描述 给定二叉树根结点 root &#xff0c;此外树的每个结点的值要么是 0&#xff0c;要么是 1。返回移除了所有不包含 1 的子树的原二叉树。( 节点 X 的子树为 X 本身&#xff0c;以及所有 X 的后代。)示例1: 输入: [1,null,0,0,1] 输出: [1,null,0,null,1]示例2: 输入: […

Vue3 实现 clipboard 复制功能

一个很小的交互功能&#xff0c;网上搜了一下有一个 vue3-clipboard 直接支持vue3&#xff0c;到github仓库看了下&#xff0c;原作者已经不维护这个项目了&#xff1a; 推荐使用 vueuse 自带的 useclipboard 功能&#xff0c;由 vue 团队维护&#xff0c;稳定性基本没问题 官…

十六章反射与注解总结

16.1 反射 反射&#xff08;Reflection&#xff09;是指在运行时获取类的信息&#xff0c;并可以动态调用类的方法、访问或修改类的属性&#xff0c;以及构造对象的能力。 Java的反射提供了一套API&#xff0c;允许你在运行时检查类的结构、调用类的方法、获取和设置类的属性&…

学习笔记三十三:准入控制

ResourceQuota准入控制器 ResourceQuota准入控制器限制cpu、内存、pod、deployment数量限制存储空间大小 LimitRanger准入控制器在limit名称空间创建pod&#xff0c;不指定资源&#xff0c;看看是否会被limitrange规则自动附加其资源限制创建pod&#xff0c;指定cpu请求是100m&…

git init

git init&#xff1a;初始化版本库 比喻&#xff1a;想象你有一块空白的画布&#xff0c;上面什么都没有。你希望开始绘制一幅画&#xff0c;但在开始之前&#xff0c;你需要明确告诉绘图工具你要开始绘制了。这个过程就好比是在画布上执行 git init。它创建了一个空白的版本库…

Xcode15 模拟器 Rosetta 模式

打开Xcode15的方式其实没有Rosetta 选项了&#xff0c;但是可以跑Xcode默认Rosetta 模拟器。在xcode中如下方式打开&#xff1a; Product -> Destination -> Destination Architectures -> 打开Show Rosetta Destinations 然后用这些带Rosetta的模拟器运行&#xff1…

java中如何压缩本地pdf文件,最好可以设置压缩率代码类实例编写?

在Java中&#xff0c;你可以使用Apache PDFBox库来压缩PDF文件。下面是一个简单的代码示例&#xff0c;展示如何使用PDFBox库来压缩PDF文件&#xff0c;并可以设置压缩率。 首先&#xff0c;确保你的项目中已经添加了PDFBox依赖。如果你使用Maven&#xff0c;可以在pom.xml文件…

《研发效能(DevOps)工程师》课程简介(二)丨IDCF

为贯彻落实《关于深化人才发展体制机制改革的意见》&#xff0c;推动实施人才强国战略&#xff0c;促进专业技术人员提升职业素养、补充新知识新技能&#xff0c;实现人力资源深度开发&#xff0c;推动经济社会全面发展&#xff0c;根据《中华人民共和国劳动法》有关规定&#…

vivado 报错之procedural assignment to a non-register result is not permitted“

文章目录 这个错误通常是由于尝试在非寄存器类型的对象上进行过程赋值所引起的。在 Verilog 中&#xff0c;当使用 always 块时&#xff0c;其中的赋值操作应该只用于寄存器类型的变量&#xff0c;比如 reg 类型。非寄存器类型的信号&#xff08;比如 wire&#xff09;不能在 a…

【tio-websocket】15、学习tio的第1步—tio-study

tio-study 工程简介 tio-study 是用于学习 t-io 的示范工程,tio-study 是入门 t-io 最好的方式!tio-study 工程演示的是一个典型的 TCP 长连接应用工程,分为 server(服务端) 和 client(客户端) 工程,server 和 client 共用 common(公共模块) 工程。 关于 tio-study…

黑色星期五来袭,Ozon为你提供丰富的推广工具和资源,助你实现销售突破!

Ozon的“黑色星期五”促销活动为卖家们提供了丰富的推广工具和资源&#xff0c;以确保他们的商品在促销期间获得最大的曝光度和销售额。卖家们应该充分利用这些机会&#xff0c;制定合适的折扣策略&#xff0c;并确保他们的商品在Ozon平台上脱颖而出。 为了推广Ozon黑色星期五促…

C++归并排序算法的应用:计算右侧小于当前元素的个数

题目 给你一个整数数组 nums &#xff0c;按要求返回一个新数组 counts 。数组 counts 有该性质&#xff1a; counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,6,1] 输出&#xff1a;[2,1,1,0] 解释&#xff1a; 5 …

深入理解TCP协议

深入理解TCP 1.TCP基础概念了解 1.1简介 TCP&#xff08;Transmission Control Protocol&#xff09;是一种计算机网络协议&#xff0c;用于在网络上可靠地传输数据。它确保数据的完整性、顺序性和可靠性&#xff0c;通过建立连接、数据分段、错误检测和恢复机制&#xff0c…

【数据结构】二叉树结构

二叉树 前言引入二叉树——二叉树的独特之处一、二叉树的结构 的 核心思想二、二叉树的代码实现>binary tree.h> binary tree.c&#xff08;一&#xff09;手动构建二叉树 <测试用>&#xff08;二&#xff09;二叉树销毁&#xff08;三&#xff09;节点个数&#x…

Java 客户端、服务端NIO大文件传输

一、需求 公司电脑不让使用U盘&#xff0c;又不想通过公司聊天软件传输&#xff0c;怕被监控。但是通过QQ、微信传输文件对文件大小又有限制。基于种种原因&#xff0c;自己简单写了个服务端、客户端进行文件传输&#xff0c;大文件最好在局域网内进行数据传输。 二、pom依赖…

OSPF高级特性1(重发布,虚链路)

目录 OSPF高级特性(1) 一、OSPF不规则区域类型 二、解决方案 1、使用虚连接 演示一&#xff1a;非骨干区域无法和骨干区域保持连通 演示二&#xff1a;骨干区域被分割 2、使用多进程双向重发布 OSPF高级特性(1) 一、OSPF不规则区域类型 产生原因&#xff1a;区…

界面组件DevExtreme v23.1 —— UI模板库更新新功能

在DevExtreme在v22.2版本中附带了针对Angular、React和Vue的新UI模板库&#xff0c;这个新的UI模板库包含多个响应式UI模板&#xff0c;您可以将其用作业务应用程序的起点&#xff0c;模板包括类似CRM的布局、仪表盘、身份验证表单等。在这篇文章中&#xff0c;我们将看看在v23…