Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池

在 Spring 中,@Async 注解用于将方法标记为异步执行的方法。当使用 @Async 注解时,该方法将在单独的线程中执行,而不会阻塞当前线程。这使得方法可以在后台执行,而不会影响主线程的执行。

在您提供的代码示例中,a1() 和 a2() 方法都被标记为 @Async,意味着它们将以异步方式执行。这意味着当调用这些方法时,它们将会在单独的线程中执行,而不会等待方法执行完成。

如果不使用 @Async 注解,则方法将会以同步方式执行。也就是说,当调用这些方法时,程序将会阻塞在方法执行处,直到方法执行完成才会继续执行后续代码。

因此,加上 @Async 注解的方法能够实现并发执行,而不加 @Async 注解的方法则会按照顺序逐个执行。根据您的代码示例,加上 @Async 注解后,a1() 和 a2() 方法将会同时启动并发执行,而不会相互阻塞。

需要注意的是,使用 @Async 注解需要配置一个任务执行器(Task Executor)来处理异步方法的调用。如果在 Spring Boot 项目中使用 @EnableAsync 注解来启用异步支持,Spring 将会自动配置默认的任务执行器。如果未配置任务执行器,则异步方法将在调用线程中执行,而不会启动新的线程来执行。

手动配置任务执行器

配置任务执行器(Task Executor)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync
public class AsyncConfig {
	// 配置任务执行器
	@Bean(name = "taskExecutor")
	public Executor taskExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

		// 设置核心线程数
		executor.setCorePoolSize(10);

		// 设置最大线程数
		executor.setMaxPoolSize(20);

		// 设置队列容量
		executor.setQueueCapacity(100);

		// 设置线程活跃时间(秒)
		executor.setKeepAliveSeconds(60);

		// 设置线程名称前缀
		executor.setThreadNamePrefix("Async-");

		// 设置拒绝策略
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

		// 初始化线程池
		executor.initialize();

		return executor;
	}
}

设置核心线程数、设置最大线程数和设置队列容量是线程池中的一些重要参数。

  • 核心线程数(Core Thread Pool Size):指的是线程池中保持的线程数量。即使这些线程处于空闲状态,它们也会一直存在于线程池中,以备接收新的任务。当线程池中的线程数量小于核心线程数时,新的任务将会创建新的线程来执行。
  • 最大线程数(Maximum Pool Size):指的是线程池中允许的最大线程数量。当线程池中的线程数量达到核心线程数时,如果还有新的任务需要执行,线程池将会再创建新的线程,直到达到最大线程数为止。当线程池中的线程数量达到最大值且队列也已满时,则会拒绝执行新的任务。
  • 队列容量(Queue Capacity):指的是线程池中任务队列可以容纳的最大任务数量。当线程池中的线程数量达到核心线程数时,如果还有新的任务需要执行,线程池将会将这些任务添加到任务队列中。如果任务队列已满,则会根据线程池的策略来处理这些被拒绝的任务。

这些参数的设置应该根据应用程序的需求和系统的资源来确定。过小的核心线程数和队列容量可能导致任务长时间排队等待执行,而过大的最大线程数则可能会消耗过多的系统资源。

定时任务A1

@Component
@EnableScheduling
public class A1 {
	@Async("taskExecutor")
	@Scheduled(cron = "0 0/1 * * * ?")
	public void a1(){
		for (int i = 0; i < 1000; i++) {
			System.out.println("我是a1");
		}
	}
}

定时任务A2

@Component
@EnableScheduling
public class A2 {
	@Async("taskExecutor")
	@Scheduled(cron = "0 0/1 * * * ?")
	public void a2(){
		for (int i = 0; i < 1000; i++) {
			System.out.println("我是a2");
		}
	}
}

加了@Async输出结果大概如下

A1和A2多线程交替执行,并发

我是a1
我是a2
我是a1
我是a2
我是a1
我是a2
我是a1
我是a2
我是a1
我是a2
...

不加@Async输出结果大概如下

先执行完A1才会去执行A2,按顺序执行,阻塞

我是a1
我是a1
我是a1
我是a1
我是a1
我是a2
我是a2
我是a2
我是a2
我是a2
...

当涉及到设置线程池的核心线程数、最大线程数和队列容量时,需要根据具体的应用场景和需求来确定。下面是一些示例:

场景一:Web 服务器请求处理
假设有一个 Web 服务器,需要处理大量的并发请求。在这种情况下,可以考虑以下设置:

  • 核心线程数:根据服务器的负载和处理能力,设置一个适当的核心线程数,例如设置为 CPU 核心数的两倍。
  • 最大线程数:根据服务器的资源和性能,设置一个合理的最大线程数,例如设置为 CPU 核心数的四倍。
  • 队列容量:如果服务器的处理能力超过了核心线程数和最大线程数,可以设置一个适当的队列容量,以便将超出处理能力的请求暂存到队列中,例如使用一个有界队列。

场景二:后台任务处理
假设有一个后台任务需要处理大量的耗时操作,比如文件处理、数据导入等。在这种情况下,可以考虑以下设置:

  • 核心线程数:根据系统的负载和任务的数量,设置一个适当的核心线程数,例如设置为固定值,如10个线程。
  • 最大线程数:根据系统的资源和性能,设置一个合理的最大线程数,例如设置为20个线程。
  • 队列容量:如果任务数量超过了核心线程数和最大线程数,可以设置一个适当的队列容量,以便将超出处理能力的任务暂存到队列中,例如使用一个无界队列。

需要根据具体的应用场景和系统要求来灵活调整这些参数。合理设置这些参数可以提高系统的性能和资源利用率,避免因为线程过多或过少导致的性能问题或资源浪费。

yml中配置线程池

也可以直接在.yml中配置线程池大小

在这里插入图片描述

spring:
  task:
    scheduling:
      # 线程池大小
      pool:
        size: 30
      # 线程名前缀
      thread-name-prefix: myTask-

定时任务A1

@Component
@EnableScheduling
@EnableAsync
public class A1 {
	@Async
	@Scheduled(cron = "0 0/1 * * * ?")
	public void a1(){
		for (int i = 0; i < 1000; i++) {
			System.out.println("我是a1");
		}
	}
}

定时任务A2

@Component
@EnableScheduling
@EnableAsync
public class A2 {
	@Async
	@Scheduled(cron = "0 0/1 * * * ?")
	public void a2(){
		for (int i = 0; i < 1000; i++) {
			System.out.println("我是a2");
		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深蓝学院】手写VIO第11章--Square Root Bundle Adjustment

文章目录 1. 文章贡献2. 在Jacobian中添加 d a m p \sqrt{damp} damp ​等价于在Hessian中添加damp2. Givens旋转3. Jacobian推导4. Refernece 1. 文章贡献 这篇文章最大的贡献在于证明了对 J l Jl Jl进行QR分解&#xff0c;对normal equation左乘 Q T Q^T QT等价于Schur comp…

创建 SSL证书并应用于WebSocket

写在前面 由于上一篇介绍 如何使用Fleck创建WebSocket服务器 &#xff0c;感觉不够完善&#xff0c;因为生产环境中肯定是需要用到ssl的&#xff0c;而创建或申请ssl证书&#xff0c;相对而言是比较繁琐的事情&#xff0c;特别是本地如果要构建一个使用ssl的测试环境时&#x…

记录一次数据中包含转义字符\引发的bug

后端返回给前端的数据是: { "bizObj": { "current": 1, "orders": [ ], "pages": 2, "records": [ { "from": "1d85b8a4bd33aaf99adc2e71ef02960e", …

【办公技巧】Word功能区灰色显示不能编辑,怎么破?

Word文档可以设置加密来保护文件禁止修改&#xff0c;但是在word文档中设置限制编辑功能时对它的作用是否有详细的了解呢&#xff1f;今天为大家介绍word限制编辑功能的作用以及忘记了限制编辑密码该如何解决。 设置限制大家应该都清楚&#xff0c;就是点击工具栏中的审阅 – …

如何让GPT/GPT4成为你的编程助手?

详情点击链接&#xff1a;如何让GPT/GPT4成为你的编程助手&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二…

Edge扩展插件安装

目录 一、 Edge扩展插件安装步骤 1.1 打开 Edge 浏览器&#xff0c;并点击右上角的菜单按钮&#xff08;三个水平点&#xff09;。 1.2 在菜单中选择“扩展”选项。 1.3 在扩展页面通过“查找新扩展”来找到你想要安装的扩展插件。 ​编辑 1.4 搜索插件 1.5 在详情页面中…

数据交付变革:研发到产运自助化的转型之路

作者 | Chris 导读 本文讲述为了提升产运侧数据观察、分析、决策的效率&#xff0c;支持业务的快速迭代&#xff0c;移动生态数据研发部对数仓建模与BI工具完成升级&#xff0c;采用宽表建模与TDA平台相结合的方案&#xff0c;一站式自助解决数据应用需求。在此过程中&#xff…

SpringBoot 集成 Kafka 高级实现

1、简介 之前博客中记录了直接使用Kafka客户端实现生产者和消费者之间的交互&#xff0c;这种方式通过设置各种参数编码繁琐&#xff0c;因此通过SpringBoot集成Kafka成为一种常用的实现&#xff0c;下面就详细介绍 SpringBoot 是如何和Kafka进行集成的&#xff0c;本文主要参考…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例3-4 CSS 立方体

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>CSS 立方体</title> <link href"CSS/style.css" rel"stylesheet" type"text/css"> <style> .box {width: 200px…

解密!神奇代码消除 Vue 中 Mac 电脑左滑右滑页面跳转

想知道如何让Mac电脑左滑右滑不再意外跳转页面吗&#xff1f;本文将揭示一个独家秘籍&#xff0c;通过简单的一行代码&#xff0c;让你的用户体验飞速提升&#xff01;别错过这个让你的Vue表格组件更顺畅的宝贵技巧&#xff01; 最近&#xff0c;我在使用 Vue 开发表格组件时遇…

初识Hadoop-概述与关键技术

一.大数据概述 1.什么是大数据 高速发展的信息时代&#xff0c;新一轮科技革命和变革正在加速推进&#xff0c;技术创新日益成为重塑经济发展模式和促进经济增长的重要驱动力量&#xff0c;而“大数据”无疑是核心推动力。 那么&#xff0c;什么是“大数据”呢&#xff1…

odoo linux环境打印乱码或无内容

在odoo打印中会遇到乱码或者无内容显示&#xff0c;需要安装一些包 sudo apt-get install ttf-wqy-zenhei sudo apt-get install ttf-wqy-microhei安装前 安装后

Oladance、南卡、Cleer开放式耳机怎么样?全方位测评大PK!

​开放式耳机作为新兴的音频设备领域中备受欢迎的选择&#xff0c;但市场上琳琅满目的产品汇集了质量千差万别的耳机&#xff0c;其中存在着一些粗制滥造的产品。身为一位音频设备测评博主&#xff0c;我经常收到有关哪个品牌的开放式耳机质量好的疑问。面对市面上众多选择&…

数据结构(三)堆和哈希表

目录 哈希表和堆什么是哈希表 &#xff1f;什么是堆 &#xff1f;什么是图 &#xff1f;案例一&#xff1a;使用python实现最小堆案例二 &#xff1a; 如何用Python通过哈希表的方式完成商品库存管理闯关题 &#xff08;包含案例三&#xff1a;python实现哈希表&#xff09; 本…

谷歌浏览器安装不在默认安装位置Selenium无法打开解决方法

Selenium之cannot find Chrome binary错误-CSDN博客 上面是我找的解决方案的链接 通过option.setBinary()的方法来指定谷歌浏览器的实际运行文件路径&#xff1b; 下面是结合我这边具体情况下写的代码 option.setBinary()中的路径是谷歌浏览器运行文件的路径&#xff1b;Sy…

SGX Enclave Measurement

文章目录 前言一、简介二、Measuring ECREATE三、Measuring Enclave Attributes四、Measuring EADD五、Measuring EEXTEND六、Measuring EINIT 前言 本文来自 Intel SGX Explained 一、简介 SGX&#xff08;Intel Software Guard Extensions&#xff09;实现了一种软件认证方…

Java多线程并发篇----第八篇

系列文章目录 文章目录 系列文章目录前言一、简述一下你对线程池的理解二、线程生命周期(状态)三、新建状态(NEW)四、就绪状态(RUNNABLE)五、运行状态(RUNNING)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…

基于Python的在线考试系统-计算机毕业设计源码78268

摘 要 本论文主要论述了如何使用python语言、Django框架开发一个在线考试系统&#xff0c;本系统将严格按照软件开发流程&#xff0c;进行各个阶段的工作&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述该系统的当前背景以及系统开发的目的&#xf…

Memory Wall in Neural Network Inference

Memory Wall in Neural Network Inference 神经网络推理的瓶颈在于访存带宽&#xff0c;通常无法发挥出加速器的全部算力。本文总结了目前常用的推理加速器及其设计&#xff0c;并分析了常用神经网络的访存瓶颈。文章大部分内容参考自Computer Architecture: A Quantitative A…

审稿变慢?还疯狂拒稿?这本毕业神刊如今争议不断,还值得一投吗?

【SciencePub学术】 IEEE ACCESS 期刊评说 网友辣评 评说1&#xff1a;麻了&#xff0c;11月17收到外审&#xff0c;现在意见还没回来啊&#xff0c;神刊肿么了&#xff1f; 评说2&#xff1a;两个审稿人评审的&#xff0c;一个拒绝&#xff08;最终意见大修&#xff09;&…
最新文章