Spring基础学习-任务执行(TaskExecutor及Async)

在做项目过程中,一些耗时长的任务可能需要在后台线程池中运行;典型的如发送邮件等,由于需要调用外部的接口来进行实际的发送操作,如果客户端在提交发送请求后一直等待服务器端发送成功后再返回,就会长时间的占用服务器的一个连接;当这类请求过多时,服务器连接数会不够用,新的连接请求可能无法得到满足,从而导致客户端连接失败。因此这类服务一般需要使用到后台线程池来处理。
在这种情况下,我们可以直接使用concurrent包中的线程池来处理,也可以使用其它的方案如Quartz等组件中的线程池来解决;为适配这些不同的方案,Spring引入了TaskExecutor接口作为顶层接口,并提供了几种不同的实现来满足不同的场景。

本文目录:

1 常见实现

Spring包含了以下TaskExecutor的实现: 

  • ThreadPoolTaskExecutor
    它是最经常使用的一个,提供了一些Bean属性用于配置java.util.concurrent.ThreadPoolExecutor并且将其包装到TaskExecutor对象中。如果需要适配java.util.concurrent.Executor,请使用ConcurrentTaskExecutor。
  • SimpleAsyncTaskExecutor
    线程不会重用,每次调用时都会重新启动一个新的线程;但它有一个最大同时执行的线程数的限制;
  • SyncTaskExecutor
    同步的执行任务,任务的执行是在主线程中,不会启动新的线程来执行提交的任务。主要使用在没有必要使用多线程的情况,如较为简单的测试用例。
  • ConcurrentTaskExecutor
    它用于适配java.util.concurrent.Executor, 一般情况下请使用ThreadPoolTaskExecutor,如果hreadPoolTaskExecutor不够灵活时可以考虑采用ConcurrentTaskExecutor。
  • SimpleThreadPoolTaskExecutor
    它是Quartz中SimpleThreadPool的一个实现,用于监听Spring生命周期回调事件。它主要使用在需要一个线程池来被Quartz和非Quartz中的对象同时共享使用的情况。
  • WorkManagerTaskExecutor
    它实现了CommonJ中的WorkManager接口,是在Spring中使用CommonJ的WorkManager时的核心类。

2 使用示例

2.1 注册TaskExecutor

此处通过spring Boot工程进行演示;在配置类中注册Bean:

@Configuration
public class MainConfiguration {
   
    @Bean
    public
  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
AsyncTaskExecutor 是一个接口,它定义了执行异步任务的方法。它是 Spring Framework 中的一部分,用于支持异步任务执行。 通常情况下,我们可以使用 ThreadPoolTaskExecutor 类来实现 AsyncTaskExecutor 接口。ThreadPoolTaskExecutor 是一个线程池实现,可以在 Spring 应用中执行异步任务。 使用 AsyncTaskExecutor,我们可以将耗时的操作放在后台线程中执行,以避免阻塞主线程。这在需要执行一些耗时的任务,例如网络请求、文件操作或者数据库查询时非常有用。 以下是一个简单的示例代码,展示了如何使用 AsyncTaskExecutor: ```java import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; public class MyService { private AsyncTaskExecutor taskExecutor; public MyService() { taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.initialize(); } public void performAsyncTask() { taskExecutor.execute(() -> { // 执行耗时操作 // ... System.out.println("耗时操作执行完成"); }); } } ``` 在上面的例子中,我们创建了一个 ThreadPoolTaskExecutor 实例,并调用了它的 execute 方法来执行一个异步任务。在 execute 方法中,我们传入了一个 Lambda 表达式,定义了我们要执行的耗时操作。 需要注意的是,在使用 AsyncTaskExecutor 时,我们需要确保在程序关闭时关闭线程池,以避免资源泄漏。 这就是 AsyncTaskExecutor 的简单介绍和用法。希望能对你有所帮助!如果有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值