Spring org.springframework.core.task.TaskExecutor
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口。 实际上,它存在的主要原因是为了在使用线程池的时候,将对Java 5的依赖抽象出来。 这个接口只有一个方法execute(Runnable task),它根据线程池的语义和配置,来接受一个执行任务。
/**
* 异步调用
*/
private TaskExecutor taskExecutor;
public TaskExecutor getTaskExecutor() {
return taskExecutor;
}
public void setTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
public void testTask(){
taskExecutor.execute(new Runnable() {
@Override
public void run() {
//业务逻辑
}
});
}
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心线程数,默认为1 -->
<property name="corePoolSize" value="10" />
<!-- 最大线程数,默认为Integer.MAX_VALUE -->
<property name="maxPoolSize" value="50" />
<!-- 队列最大长度,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE -->
<property name="queueCapacity" value="1000" />
<!-- 线程池维护线程所允许的空闲时间,默认为60s -->
<property name="keepAliveSeconds" value="300" />
<!-- 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者 -->
<property name="rejectedExecutionHandler">
<!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 -->
<!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 -->
<!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
<!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</property>
</bean>
在Spring发行包中预定义了一些TaskExecutor实现。有了它们,你甚至不需要再自行实现了。
SimpleAsyncTaskExecutor 类
这个实现不重用任何线程,或者说它每次调用都启动一个新线程。但是,它还是支持对并发总数设限,当超过线程并发总数限制时,阻塞新的调用,直到有位置被释放。如果你需要真正的池,请继续往下看。
SyncTaskExecutor类
这个实现不会异步执行。相反,每次调用都在发起调用的线程中执行。它的主要用处是在不需要多线程的时候,比如简单的test case。
ConcurrentTaskExecutor 类
这个实现是对Java 5 java.util.concurrent.Executor类的包装。有另一个备选, ThreadPoolTaskExecutor类,它暴露了Executor的配置参数作为bean属性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一个备选。
SimpleThreadPoolTaskExecutor 类
这个实现实际上是Quartz的SimpleThreadPool类的子类,它会监听Spring的生命周期回调。当你有线程池,需要在Quartz和非Quartz组件中共用时,这是它的典型用处。
ThreadPoolTaskExecutor 类
它不支持任何对java.util.concurrent包的替换或者下行移植。Doug Lea和Dawid Kurzyniec对java.util.concurrent的实现都采用了不同的包结构,导致它们无法正确运行。
这个实现只能在Java 5环境中使用,但是却是这个环境中最常用的。它暴露的bean properties可以用来配置一个java.util.concurrent.ThreadPoolExecutor,把它包装到一个TaskExecutor中。如果你需要更加先进的类,比如ScheduledThreadPoolExecutor,我们建议你使用ConcurrentTaskExecutor来替代。
TimerTaskExecutor类
这个实现使用一个TimerTask作为其背后的实现。它和SyncTaskExecutor的不同在于,方法调用是在一个独立的线程中进行的,虽然在那个线程中是同步的。
WorkManagerTaskExecutor类
CommonJ 是BEA和IBM联合开发的一套规范。这些规范并非Java EE的标准,但它是BEA和IBM的应用服务器实现的共同标准
这个实现使用了CommonJ WorkManager作为其底层实现,是在Spring context中配置CommonJ WorkManager应用的最重要的类。和SimpleThreadPoolTaskExecutor类似,这个类实现了WorkManager接口,因此可以直接作为WorkManager使用。
分享到:
相关推荐
在现代应用中,高效地处理并发任务是至关重要的,Spring为此提供了异步任务处理的功能,可以显著提升系统的响应速度和性能。本文将深入探讨在Spring中如何利用多线程和动态任务来实现异步处理,并分享一些实践心得。...
Spring的TaskExecutor是Java线程池抽象的一个重要组成部分,它为开发者提供了一种在Spring框架内使用线程池的方式,而无需直接依赖于特定的Java版本或Java EE环境中的线程池实现。TaskExecutor接口的设计使得在不同...
Spring TaskExecutor是Spring框架的一部分,提供了异步任务执行的能力。它允许开发者创建线程池,调度和管理后台任务。TaskExecutor接口提供了一种抽象,使得开发者无需关心底层的线程管理和并发细节,只需关注任务...
在使用`@Async`之前,需要配置一个`TaskExecutor`,这是Spring用于执行异步任务的接口。Spring MVC默认提供了一个简单的`SimpleAsyncTaskExecutor`,但通常我们会选择更高效的实现,如`ThreadPoolTaskExecutor`。 ...
一、Spring异步线程池类图 Spring提供了一系列的`TaskExecutor`实现,它们根据不同的需求和场景有不同的特性和行为。这些实现包括但不限于: 1. `SimpleAsyncTaskExecutor`:每次请求都会启动新的线程,不进行线程...
当一个方法被`@Async`标记后,Spring会使用配置的`TaskExecutor`来异步执行这个方法。 ```java @Service public class AsyncService { @Async public Future<String> longRunningTask() { // 长时间运行的任务 ...
Spring TaskExecutor是Spring框架中的一个核心组件,它提供了一种在后台执行任务的机制,使得开发者可以方便地异步处理任务,提高应用的性能和响应速度。本篇将深入探讨Spring TaskExecutor的基本概念、使用方法以及...
因此,我们可以通过配置自定义的`TaskExecutor`来调整异步任务的执行策略,例如使用线程池: ```java @Configuration @EnableAsync public class AppConfig implements AsyncConfigurer { @Override public ...
TaskExecutor是Spring异步线程池的接口类,定义了异步线程池的基本操作。SimpleAsyncTaskExecutor是一个简单的异步线程池, 每次调用都会创建一个新的线程。SyncTaskExecutor是一个同步操作,不适用于异步调用。...
3. **Spring TaskExecutor**:Spring框架中的TaskExecutor接口提供了一种通用的方式来异步执行任务,无需关心线程管理细节。开发者可以通过配置TaskExecutor,比如使用ThreadPoolTaskExecutor或...
在Spring Boot应用中,我们经常需要处理大量的并发请求,这时自定义异步线程池就显得尤为重要。异步处理能够提高应用的响应速度,避免主线程阻塞,从而提升系统性能。本文将详细介绍两种在Spring Boot中实现自定义...
【Spring Async:实现异步调用示例】 在软件开发中,特别是在高并发场景下,异步调用是一个重要的优化手段。同步调用是传统的执行方式,它遵循线性顺序,每个方法调用必须等待前一个方法执行完毕才能继续。而异步...
被注解的方法会由Spring的TaskExecutor执行,而不是由调用它的线程执行。 3. **配置异步处理** 在Spring Boot应用中,可以通过`@EnableAsync`注解开启异步支持,这通常放在配置类上。同时,可以使用`...
结合 Spring 的 TaskExecutor,MyBatis-Spring 允许你以异步方式执行数据库操作。通过 `SqlSessionCallback` 或 `SqlSessionRunnable`,你可以编写回调代码来执行 SQL 查询,并在后台线程中运行。 7. **整合测试**...
3. **配置Spring Bean**:在Spring的配置文件中,我们需要将这个拦截器注册到`TaskExecutor`中,这样每次异步任务被提交时,都会调用该拦截器。 4. **测试和验证**:创建测试用例,确保在异步方法执行前后,MDC中的...
`spring-context-support.jar`是Spring框架对Quartz和Commons JCR等第三方调度库的支持,同时也包含Spring自己的`TaskExecutor`和`TaskScheduler`接口,用于实现异步任务和定时任务。 1. **Spring TaskExecutor**: ...
Spring的TaskExecutor接口和ThreadPoolTaskExecutor类可以方便地实现异步任务和定时任务,这对于后台服务的自动化和定时运行非常有用。而RMI(Remote Method Invocation)支持则使得Spring应用能够跨网络进行分布式...
首先,我们需要了解Spring的TaskExecutor接口,这是Spring提供的用于异步执行任务的抽象。线程池的实现可以通过实现这个接口来完成,Spring提供了ThreadPoolTaskExecutor作为线程池的实现。通过配置...