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

这篇具有很好参考价值的文章主要介绍了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中配置线程池大小

请求地址加不加@async有什么区别吗?,Spring学习笔记,spring boot,java,spring

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文章来源地址https://www.toymoban.com/news/detail-803084.html

@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");
		}
	}
}

到了这里,关于Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 提升Spring Boot应用性能的秘密武器:揭秘@Async注解的实用技巧

    在日常业务开发中,异步编程已成为应对并发挑战和提升应用程序性能的关键策略。传统的同步编程方式,由于会阻碍主线程执行后续任务直至程序代码执行结束,不可避免地降低了程序整体效率与响应速度。因此,为克服这一瓶颈,开发者广泛采用异步编程技术,将那些可

    2024年03月11日
    浏览(45)
  • import时加{}与不加的区别

    在JavaScript中,使用 import 语句导入模块时,加上花括号 {} 与不加的区别在于: 不加花括号:导入整个模块对象。例如, import axios from \\\'axios\\\' 会导入整个 axios 模块,可以通过 axios.get() 等方法来使用它。 加上花括号:只导入模块中的指定变量或函数。例如, import { get, post }

    2024年02月16日
    浏览(35)
  • import后加不加{}的区别(es6引用)

    目录 背景: 1.不加{} 2.加{} 总结: ES6使用import引入定义模块时加不加花括号: export及export default的区别: 背景: 当需要在main.js中引入A.js 1.不加{} 这种引入方法,A.js文件中需要提供默认的 export defulat导出 ( 必须是默认导出 ), 这样在main.js文件中才可以使用A 2.加{} 这种引

    2024年02月04日
    浏览(37)
  • Spring Boot 2与Spring Boot 3的区别

    # Spring Boot 2与Spring Boot 3的区别 Spring Boot是一个流行的Java框架,简化了基于Spring的应用程序的开发。它提供了一套默认配置和自动配置选项,使开发人员更容易开始使用Spring项目。在本博客文章中,我们将探讨Spring Boot 2和Spring Boot 3之间的区别。 ## 1. 介绍 Spring Boot 2于2018年发

    2024年02月08日
    浏览(46)
  • Spring Boot 和 Spring Cloud Framework 的区别

    大家好,如果您从事 Java 开发并创建了微服务,那么您可能知道  Spring Boot 和 Spring Cloud是两个流行的基于 Java 的框架,广泛用于构建企业级应用程序,尤其是服务器端后端 Java 应用程序。这两个框架均由 Spring 团队开发,并提供独特的功能,使它们在市场上脱颖而出。虽然

    2024年02月07日
    浏览(42)
  • JDK 17和JDK 8及Spring Boot 2和Spring Boot 3的区别:

    JDK 17和JDK 8的区别: 新的语言特性 JDK 17引入了新的语言特性,如Sealed类、Pattern Matching for instanceof、Switch Expressions、Text Blocks等。这些特性让代码更简洁、可读性更高、易于维护。 性能提升 JDK 17对JIT编译器进行了改进,使得代码的性能得到了提升。此外,JDK 17还引入了一个新

    2024年02月11日
    浏览(42)
  • SpringBoot整理-Spring Boot与Spring MVC的区别

    Spring Boot 和 Spring MVC 是 Spring 框架的两个不同部分,它们在 Java Web 开发中扮演着各自独特的角色。理解它们之间的区别有助于更好地利用 Spring 生态系统进行有效的应用开发。 Spring MVC 定义:  Spring MVC 是基于 Model-View-Controller(模型-视图-控制器)设计模式的一个 

    2024年01月22日
    浏览(44)
  • 聊聊Spring Boot几个版本的区别

    本文主要研究一下Spring Boot 2.7, 3.x这几个版本的区别 Spring Boot 2.0在2018年2月28日发布,Spring Boot 2.7是2.x的最后一个发布版本,该版本的开源将于2023年11月停止支持,商业支持可延长到2025年2月 flyway从8.0更新到了8.5 H2更新到了2.1.120 MSSQL driver从v9更新到了v10 OkHttp3将不再支持,改为

    2024年02月13日
    浏览(35)
  • 【maven】构建项目前clean和不clean的区别

    其实很简单,但是百度搜了一下,还是没人能简单说明白。 搬用之前做C++项目时总结结论: 所以自己在IDE里一遍遍测试程序能否跑通的时候,不需要clean,因为反正还要改嘛。 但是这个项目测试好了,你要打成jar包给别的项目用时,就要clean再package或install,虽然不clean直接

    2024年02月14日
    浏览(23)
  • post请求可以不加@RequestBody注解么?使用与不使用@RequestBody注解的区别

    @RequestBody只能处理json格式的数据。 使用@RequestBody注解时,用于接收Content-Type为application/json类型的请求,数据类型是JSON:{“aaa”:“111”,“bbb”:“222”} 不加@RequestBody可以支持表单的默认格式,但是不能处理json格式的数据(在restTemplete进行远程服务调用时,是以json格式进行实体

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包