Spring 中的 @Async 和 @Scheduled 理解

Spring异步任务和定时任务里如何优雅传递用户信息?TransmittableThreadLocal整合@Async与@Scheduled保姆级指南 本文深入探讨了Spring异步任务和定时任务中用户信息传递的解决方案,重点介绍了阿里巴巴开源的TransmittableThreadLocal(TTL)技术。通过详细的原理解析和实战代码示例,展示了如何实现线程上下文的无缝传递,解决多线程环境下的数据隔离问题,适用于多租户系统、链路追踪等复杂场景。 阅读详情

@Async

spring-test.xml文件

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context= "http://www.springframework.org/schema/context"
xmlns:task= "http://www.springframework.org/schema/task"
xsi:schemaLocation= "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd">
<task:annotation-driven scheduler="myScheduler" executor="myExecutor"/>
<task:executor id="myExecutor" pool-size="20"/>
<task:scheduler id="myScheduler" pool-size="5"/>
<bean id="hello" class="hello.world.task.TestTask" />
</beans>

spring官网例子

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
      
import java.util.concurrent.Future;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class GitHubLookupService {
RestTemplate restTemplate = new RestTemplate();
@Async
public Future<User> findUser(String user) throws InterruptedException {
System.out.println( "Looking up " + user);
User results = restTemplate.getForObject( "https://api.github.com/users/" + user, User.class);
// Artificial delay of 1s for demonstration purposes
Thread.sleep(1000L);
return new AsyncResult<User>(results);
}
}

Async动作类

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      
package hello.world.task;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import java.util.concurrent.Future;
/**
* Created by yang on 15-12-3.
*/
public class TestTask {
@Async
public Future<String> run() throws InterruptedException {
System.out.println(Thread.currentThread().getName());
Thread.sleep( 20 * 1000);
return new AsyncResult<String>( "hello");
}
}

java测试类

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
      
package hello.world;
import hello.world.task.TestTask;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
/**
* Created by yang on 15-11-9.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( "classpath:spring-test.xml")
public class HelloTest {
@Autowired
private TestTask testTask;
@Test
public void run() throws ExecutionException, InterruptedException {
Future<String> hello = testTask.run();
System.out.println( "after 20 s?");
String h = hello.get();
System.out.println(h);
}
}

以上,它是以myexecutor的线程池来执行的.

@Scheduled

将@Async改为@Scheduled

      
1
2
3
4
5
6
7
      
public class TestTask {
@Scheduled(cron = "*/2 * * * * *")
public void run() throws InterruptedException {
System.out.println(Thread.currentThread().getName());
}
}

看执行结果,它是以myscheduler的线程池来执行的,而且返回值只能是void.

同时使用 @Scheduled 和 @Async

不过注意,如果这样子使用了,异步执行的返回结果Future就不要这样子使用了,这时返回值只能是void.

同时使用这两个注解的效果,相当于@Scheduled负责调度,而executor负责执行。

看打印的线程可知:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
      
myExecutor-1
myExecutor-2
myExecutor-3
myExecutor-4
myExecutor-5
myExecutor-6
myExecutor-7
myExecutor-8
myExecutor-9
myExecutor-10
myExecutor-11
myExecutor-12
myExecutor-13
myExecutor-14
myExecutor-15
myExecutor-16

它是非常有规律的:每一个任务,都是下一条线程。然后轮回。


基于deepseek本地模型的本地知识库构建 通过以上步骤,你已经成功构建了一个基于 AnythingLLM 和 LM Studio 的本地知识库。这个系统不仅能够高效地存储和检索知识,还能结合强大的语言模型生成准确的回答。你可以根据自己的需求进一步扩展和优化这个系统,比如增加更多的文档格式支持、优化检索算法等。 阅读详情

相关推荐

【计算机组成原理实验】状态机实验

理解“状态机”概念,掌握“状态机”思想描述时序系统。通过下列三种基于D触发器的计数器结构,构建状态机的状态转移电路:环形计数器、扭环计数器和条件判断的扭环计数器。基于“状态机”原理,设计一个“交通灯”系统:控制红黄绿信号灯按照以下顺序循环点亮:“绿 黄 红 绿 ……”,红灯、绿灯和黄灯的亮灯持续时间可以通过拨码开关独立设置。红灯和绿灯是持续亮灯模式,黄灯则是闪烁亮灯模式。

Rover_jb的博客 1332

@Scheduled和@Async解析与自定义线程池

@Scheduled和@Async注解解析与自定义线程池

qq_39173672的博客 3215

【一文读懂】卫星轨道的轨道参数(六根数)和位置速度矢量转换及其在终端距离、相对速度和多普勒频移计算中的应用

本文首先介绍了卫星轨道的六根数参数:半长轴 a、偏心率 e、轨道倾角 i、升交点赤经 Ω、近地点幅角 ω 以及真近点角 ν,并探讨了如何利用这些参数计算卫星与地面终端之间的距离、相对速度及由此产生的多普勒频移。利用开普勒运动公式计算当前瞬间的轨道半径;根据真近点角 ν 在围心坐标系中计算位置矢量和速度矢量;利用旋转矩阵(依次旋转 ω、i、Ω)将围心坐标系的状态矢量转换到地心惯性坐标系;最终结合地面终端信息,计算卫星与终端的欧氏距离、沿视线的相对速度及多普勒频移。

u011376987的博客 9494

定时任务@Scheduled 和 异步@Async

Spring 3.0 版本之后自带定时任务,提供了`@EnableScheduling`注解和`@Scheduled`注解来实现定时任务功能。

Lifelong learning 5951

【学习记录】IIC驱动ICM42670+卡尔曼滤波+四元数姿态角解算

ICM42670陀螺仪可以使用iic驱动,单片机平台使用GD32f305VE。

liarsup的博客 8265

从时序参数到电压供给:TTL(RGB)液晶屏驱动调试全解析

本文全面解析TTL(RGB)液晶屏驱动调试的关键技术,从时序参数配置到电压供给系统搭建,详细介绍了同步信号参数、寄存器配置技巧以及升压电路设计。通过实战案例和常见故障分析,帮助工程师快速掌握液晶显示屏调试方法,提升开发效率。

weixin_30588675的博客 247

Spring @Scheduled @Async联合实现调度任务(2017.11.28更新)

定时任务之前一直用的是quartz之类,但是注意到Spring中其实也提供了一种简单的调度注释@Scheduled,也就想尝一下鲜.. 代码示意如下: @Component @EnableScheduling public class AsyncTaskHandlerTask { @Scheduled(fixedDelay = 1000) public void...

weixin_30532987的博客 508

LIN总线CAPL函数实战——动态控制报文发送(linDeactivateSlot与linActivateSlot)

本文深入解析了LIN总线测试中动态控制报文发送的核心CAPL函数linDeactivateSlot与linActivateSlot的实战应用。通过详细拆解函数参数、生效范围及限制,并结合故障注入、功耗测试等实际场景的代码示例,指导测试工程师在仿真LIN主节点时,灵活调度报文发送,实现高效自动化测试。

weixin_29255731的博客 348

@Scheduled@Async使用注意事项

springboot中的@Scheduled的默认执行器是ThreadPoolTaskScheduler,它是一个poolSize=1的线程池,所以项目中所有的@Scheduled定时任务会串行执行,这显然是会有问题的。exposeUnconfigurableExecutor:暴露不可配置的执行器,指定是否将SimpleAsyncTaskExecutor实例公开为不可配置的执行器。threadPriority:线程优先级,用于设置异步任务所在线程的优先级。默认值为Integer.MAX_VALUE。

wang_keng的博客 1398

2026年VIVO嵌入式岗位高频面试题(含参考答案)

摘要:VIVO嵌入式岗位考核涵盖智能手机、IoT设备、芯片适配等方向,重点考察硬件底层交互、RTOS/Linux开发、C/C++功底与问题排查能力。题目按优先级排序,分硬件架构、RTOS、C/C++、数据结构、Linux实践、行业认知6大模块,共40道题。硬件部分涉及中断、ARM架构、加速技术、BSP开发等;RTOS部分区分硬/软实时系统;C/C++部分侧重内存管理、位操作;Linux部分考察常用命令;行业部分关注鸿蒙等系统理念。题目设计贴合实际工作场景,全面评估嵌入式开发能力。

Open 52

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 354

使用spring自带的定时任务遇到的坑-【Async注解和Scheduled注解一起使用的问题】

和项目侧的同事了解到定时任务使用的是Scheduled注解的方式,定时任务设置的是fixedRateString的方式,并且添加了Async注解,期望是使用线程池的方式去执行任务。然后过了一会之后,事情变的诡异起来,因为我设置的是随着执行次数变多,线程睡眠的时间越长,当线程睡眠的时间超过间隔时间时。配置,这样Scheduled的核心线程数就会有n个,避免出现任务之间互相阻塞的情况。这样就会发现定时任务执行的间隔时间不会按照设定的去走了。的线程,按照线程池的命名规则不应该出现这样的问题。

u012724101的博客 1073

[毕设项目-MCP+ENSP]一句话搞定ENSP自动化:MCP + LLM实战(架构图、工具清单、踩坑全解)

用 MCP + LLM 把“人话”变成对华为 ENSP 的安全自动化操作,三款工具覆盖配置/查询/落盘,配套架构、实战与排坑清单。

逐梦苍穹的博客 2539

springboot中@Scheduled 和@Async的使用

cron表达式语法 [秒] [分] [小时] [日] [月] [周] [年] 通配符说明 【*】 表示所有值。例如:在分的字段上设置 *,表示每一分钟都会触发。 【?】 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为”?” 具体设置为 0 0 0 10 * ? 【-】 表示区间。例如 在小时上设置 “10-12”,表示 10,11,12点都会触发。 【,】 表示指定多个值,例如在周字段上设置 “MON,WED,FR

qq_40396818的博客 1099

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

计算机控制技术及应用

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

spring注解整理(持续更新)

1·@configuration 表明当前类等效于一个xml文件 没有使用@componentScan,表明所有bean都在此类中定义 2·@bean 返回一个bean,bean的名称为方法名 在spring中,容器中存在某个bean,就可以在另一个bean的生命方法的入参中注入 3 ...

weixin_40187536的博客 271

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring 原理之 Bean生命周期

Spring 原理之 Bean生命周期 前言 在面试的时候,Bean的生命周期一般都会被问到,之前有整理过 Spring 的原理之Ioc,但是 没有对Bean的生命周期流程单独汇总说明 下面介绍一下,也更方便自己掌握。 Bean生命周期 总图: 看这个图很复杂,其实很简单,Bean的生命周期就分为以下几个步骤:(是不是real简单~) 实例化(Instantiation) 属性赋值(populate) 初始化(Initialization) 销毁(Destruction) 在 Spring DI 运行

weixin_42272869的博客 357

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring Boot 定时任务

三种方式 注解 @Scheduled @Component @Configuration //1.主要用于标记配置类,兼备Component的效果。 @EnableScheduling // 2.开启定时任务 public class SaticScheduleTask { //3.添加定时任务 @Scheduled(cron = "0/5 * * * * ?") //或直接指定时间间隔,例如:5秒 //@Scheduled(fixedRate=5000)

qq_41149775的博客 241

Spring的常用注解

Spring的注解大全

m0_58550256的博客 206

Spring Task 定时任务没有定时执行,为什么呢?

前言 定时任务的使用,在开发中可谓是家常便饭了,定时发送邮件、短信。避免数据库,数据表过大,定时将数据转储。通知、对账等等场景。 当然实现定时任务的方式也有很多,比如使用 linux下的 crontab 脚本,jdk 中自带的 Timer 类。Spring Task或是 Quartz 。 相信你也有过如下的疑问: Spring Task 的 crontab 的表...

热衷技术的Java程序员 3023

Java 必须掌握的 N 种 Spring 常用注解详解

本文系统介绍了Spring框架中的核心注解及其应用场景。主要内容包括:1)核心容器注解(如@Component、@Autowired)实现IoC/DI;2)Web MVC注解(如@RestController、@RequestMapping)简化Web开发;3)数据访问与事务注解(如@Transactional、@Entity)管理数据库操作;4)AOP相关注解(如@Aspect)实现切面编程;5)Spring Boot专用注解(如@SpringBootApplication)快速构建应用;6)缓存、调度、

油墨香^-^的博客 660

Java12 种 Spring 常用注解!@Value 为属性注入值(属性上) 支持如下方式的注入: 》注入普通字符 @Value("Michael Jackson")String name; 》注入

1.声明bean的注解 @Component 组件,没有明确的角色 @Service 在业务逻辑层使用(service层) @Repository 在数据访问层使用(dao层) @Controller 在展现层使用,控制器的声明(C) 2.注入bean的注解 @Autowired:由Spring提供 @Inject:由JSR-330提供 @Resource:由JSR-250提供 都可以注解在set...

zhuguang10的博客 660

线程池、消息队列(RabbitMQ、Kafka)、Spring 的 @Async/@Scheduled

本文对比分析了线程池、消息队列(RabbitMQ/Kafka)和Spring异步调度机制。线程池适用于进程内并发任务控制,通过复用线程降低开销;消息队列(MQ)实现跨进程通信,RabbitMQ适合灵活路由的任务队列,Kafka则擅长高吞吐事件流处理。Spring的@Async/@Scheduled提供便捷的进程内异步和定时任务支持。选型建议:进程内任务用线程池,跨进程解耦用MQ(RabbitMQ重路由/Kafka重吞吐)。文章强调幂等设计、死信队列等工程实践,并指出常见误区如无界队列OOM风险。最后给出快速

weixin_74344472的博客 1340

Spring任务调度源码分析:@Async与@Scheduled实现

Spring任务调度源码分析:@Async与@Scheduled实现 本文深入分析了Spring框架中任务调度的核心实现机制,重点解析了@Async异步执行和@Scheduled定时任务调度的源码实现。文章从任务调度器的初始化与线程池配置入手,详细探讨了ThreadPoolTaskScheduler的核心实现、调度器继承体系以及配置属性详解。随后深入分析了@Async注解的异步方法执行机制,包括其...

gitblog_01072的博客 561

【Spring】异步任务注解@Async、@EnableAsync、@EnableScheduler、@Scheduled

Spring中用@Async注解标记的方法,称为异步方法,其实就相当于我们自己在当前方法里面:new Thread(()-> System.out.println(“hello world !”))。 按@Async注解使用的基本方法: 在方法上添加@Async注解; 所使用的@Async注解方法的类对象应该是Spring容器管理的bean对象; 调用异步方法的类上需要配置上注解@EnableAsync 异步不生效问题 不要 同类方法调用 异步方法所在类的另一个方法调用这个异步方法,异步不会生效!

qq_27579471的博客 1677

scheduled 一秒钟执行一次_Springboot学习记录14 异步调用:@Scheduled和@Async

因为完全没有接触过Springboot的异步调用,所以本学习记录的代码以及说明,大部分参考自gitee码云的如下工程。鸣谢!https://gitee.com/didispace/SpringBoot-Learning.git本学习记录的示例代码克隆地址,分支为develophttps://gitee.com/kutilion/MyArtifactForEffectiveJava.git本章示例代...

weixin_39569543的博客 5051

如何利用@Scheduled和@Async实现高效的多线程定时任务调度

本文深入探讨了如何结合Spring Boot的@Scheduled和@Async注解,通过配置自定义线程池来解决单线程定时任务调度中的并发问题,实现高效的多线程定时任务执行。文章提供了从基础原理到实战改造的完整方案,并给出了线程池调优与并发冲突处理的实用建议,旨在提升系统吞吐量与任务执行效率。

earth的博客 291
上一篇: 浏览器中F5和CTRL F5的行为区别
下一篇: poi自动调整宽度
DViewer
博客等级 码龄16年 16粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值