首页 > 其他分享 >异步任务

异步任务

时间:2023-12-15 14:44:55浏览次数:22  
标签:异步 Executor 任务 线程 Async 注解 方法

参考https://blog.csdn.net/m0_65992672/article/details/130422166

 

@SpringBootApplication
@EnableAsync//开启异步任务支持
public class ApplicationStarter {
public static void main(String[] args) {
SpringApplication.run(ApplicationStarter.class,args);
}
}

 

 

@Service
public class AsyncServiceImpl implements AsyncService {

//使用@Async注解标记的方法 会提交到一个异步任务中进行执行,第一次不会执行该方法,
//如果不添加该注解,controller中调用该方法会等待5秒在响应
//异步任务
@Async
public void t1() {
// 模拟耗时任务
try {
Thread.sleep(TimeUnit.SECONDS.toMillis(5));
} catch (InterruptedException e) {
e.printStackTrace();
}
//因为该异步方法中使用了休眠,所以过5秒才会执行下面代码
System.out.println("异步方法中:耗时时间已走完");
}

@Async
public Future<String> t2(){
// 模拟耗时任务
try {
Thread.sleep(TimeUnit.SECONDS.toMillis(5));
} catch (InterruptedException e) {
e.printStackTrace();
}
return new AsyncResult<>("async tasks done!");
}


}

 

 

 

3、异步任务相关限制
被@Async注解的异步任务方法存在相关限制:

被@Async注解的方法必须是public的,这样方法才可以被代理。

不能在同一个类中调用@Async方法,因为同一个类中调用会绕过方法代理,调用的是实际的方法。

被@Async注解的方法不能是static。

@Async注解不能与 Bean 对象的生命周期回调函数(比如@PostConstruct)一起注解到同一个方法中。解决方法可参考:Spring - The @Async annotation

异步类必须注入到 Spring IOC 容器中(也即异步类必须被@Component/@Service等进行注解)。

其他类中使用异步类对象必须通过@Autowired等方式进行注入,不能手动new对象。

4、自定义 Executor(自定义线程池)
默认情况下,Spring 会自动搜索相关线程池定义:要么是一个唯一TaskExecutor Bean 实例,要么是一个名称为taskExecutor的Executor Bean 实例。如果这两个 Bean 实例都不存在,就会使用SimpleAsyncTaskExecutor来异步执行被@Async注解的方法。

综上,可以知道,默认情况下,Spring 使用的 Executor 是SimpleAsyncTaskExecutor,SimpleAsyncTaskExecutor每次调用都会创建一个新的线程,不会重用之前的线程。很多时候,这种实现方式不符合我们的业务场景,因此通常我们都会自定义一个 Executor 来替换SimpleAsyncTaskExecutor。

对于自定义 Executor(自定义线程池),可以分为如下两个层级:

应用层级:即全局生效的 Executor。依据 Spring 默认搜索机制,其实就是配置一个全局唯一的TaskExecutor实例或者一个名称为taskExecutor的Executor实例即可,如下所示:

方法层级:即为单独一个或多个方法指定运行线程池,其他未指定的异步方法运行在默认线程池。如下所示:
 

标签:异步,Executor,任务,线程,Async,注解,方法
From: https://www.cnblogs.com/Mr-Y1907/p/17903329.html

相关文章

  • BiliBiliTool丨超级值得好用的哔哩哔哩自动执行任务小助手
    BiliBiliTool使用平台:macOS/Windows/Linux神器直通 网友就是厉害,偷懒偷到神奇的境界。看个视频、投个币,或者是想给自己的账户攒点经验升级,都可以做到自动化……BiliBiliTool是一个自动执行任务的工具,当我们忘记做某项任务时,它会像一个贴心小助手,按照我们预先吩咐的命令......
  • 《平面设计基础》课程考核任务书
    《平面设计基础》课程考核任务书一、项目设计参考选题1)原创性:作品应具有创新品质和时代特征。2)功能性:作品应有转化为实际应用的可能性。3)审美性:设计作品应突出地域文化特色,工艺及载体形式具有独特性。4)规范性:提交的作品应具备规范性、完整性和系统性。二、项目设计具体要求......
  • 08-asyncio -- 异步IO
    写在前面async--异步io---IOasyncio--异步IO1.Python协程介绍协程,又称之为微线程,本质上还是python运行的单进程单线程程序。和线程不同,协程不涉及到系统级的上下文切换,而是在单个线程内进行锁执行代码块的切换。因此协程并没有提高计算速度,而是在代码执行的等待时......
  • FreeRTOS中的任务优先级与单片机中断优先级的异同深析
    引言:在实时嵌入式系统开发中,任务的优先级和中断的优先级是关键的调度和响应机制。FreeRTOS提供了丰富的任务调度功能,而单片机的中断系统也具有类似的机制。本篇博客将深入探讨FreeRTOS中的任务优先级与单片机中断优先级的异同,通过代码演示展示它们的工作原理和使用方式。任务优先......
  • .net中通过定时任务框架Quartz.NET来实现定期网络状态检查
     Quartz.NET是一个用于在.NET应用程序中实现作业调度和定时任务的开源框架。它允许你在应用程序中定义和调度作业,支持复杂的调度需求,例如定时、重复、错过执行、依赖性等。下面,我将通过一个简单的实例来详细描述Quartz.NET的功能、使用方法,并提供源代码。在这个示例中,我......
  • Java实现异步的几种方式
    普通线程实现异步,但频繁创建、销毁线程比较耗资源,所以一般交给线程池执行//创建需要异步执行的逻辑publicclassAsyncThreadimplementsRunnable{@Overridepublicvoidrun(){System.out.println("异步线程开始");longstart=System.current......
  • crontab定时任务不执行?那就试试最初的方法吧
    问题背景服务器的操作系统是centos7,没有python3,给它安装了一个miniconda3,然后发现python脚本手动执行没问题,放到定时任务里面就不执行了。定位问题查看/etc/crontab文件,内容如下。SHELL=/usr/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root#Fordetailsseem......
  • SpringBoot中项目启动及定时任务缓存数据库常用数据至内存变量并转换后高频调用
    场景定时任务中需要获取数据库中数据进行数据转换成需要的格式并进行后续的业务处理。数据库中的数据更新频率不高。可将数据库中数据在项目启动后读取一遍数据,然后再通过定时任务定时查询数据库更新数据。实现数据库缓存的方式有多种,比如以下:SpringBoot中通过自定义缓存注解......
  • python 的 多个异步库如何兼容
    概述异步编程的重要性和不同的异步库介绍异步编程是现代软件开发中的重要概念,特别是在处理IO密集型任务时,它的作用尤为明显。不同的异步库为Python提供了多种不同的方式来实现异步编程。这些异步库包括但不限于asyncio、tornado、gevent等等。在本文中,我们将介绍这些不同的异步库及......
  • 03 开源任务管理系统:创建一个任务
    GitHub地址:https://github.com/dom-bro/task-manager虽说是一个任务管理系统,但简单地讲,其实就是任务的增删改查(CRUD)。其中最重要的又当属增,即创建任务,此为数据之源,删改查都依赖于它所产生的数据。交互设计凭着程序员的直觉,最初做成了一个表单如下图,表单项也对应了数据库......