`
kim_miao
  • 浏览: 190875 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring中的ThreadPoolTaskExecutor

 
阅读更多
在观察线上系统的运行情况下,发现在错误日志中有这类错误信息,org.springframework.core.task.TaskRejectedException,于是便对ThreadPoolTaskExecutor类做下梳理.

1.ThreadPoolExecutor
Spring中的ThreadPoolTaskExecutor是借助于JDK并发包中的java.util.concurrent.ThreadPoolExecutor来实现的.下面先学习下ThreadPoolExecutor中的相关信息.ThreadPoolExecutor构造函数如下:

	    public ThreadPoolExecutor(int corePoolSize,
	                              int maximumPoolSize,
	                              long keepAliveTime,
	                              TimeUnit unit,
	                              BlockingQueue<Runnable> workQueue,
	                              ThreadFactory threadFactory,
	                              RejectedExecutionHandler handler) {
	}


下面分别说下各项代表的具体意义:

int corePoolSize:线程池维护线程的最小数量.
int maximumPoolSize:线程池维护线程的最大数量.
long keepAliveTime:空闲线程的存活时间.
TimeUnit unit: 时间单位,现有纳秒,微秒,毫秒,秒枚举值.
BlockingQueue<Runnable> workQueue:持有等待执行的任务队列.
RejectedExecutionHandler handler:
用来拒绝一个任务的执行,有两种情况会发生这种情况。
一是在execute方法中若addIfUnderMaximumPoolSize(command)为false,即线程池已经饱和;
二是在execute方法中, 发现runState!=RUNNING || poolSize == 0,即已经shutdown,就调用ensureQueuedTaskHandled(Runnable command),在该方法中有可能调用reject。

Reject策略预定义有四种:
(1)ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。
(2)ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.
(3)ThreadPoolExecutor.DiscardPolicy策略,不能执行的任务将被丢弃.
(4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程).


2. Spring中ThreadPoolTaskExecutor的使用
最常用方式就是做为BEAN注入到容器中,如下代码:
	<bean id="threadPoolTaskExecutor"
		class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
		<property name="corePoolSize" value="10" />
		<property name="maxPoolSize" value="15" />
		<property name="queueCapacity" value="1000" />
	</bean>

          
ThreadPoolExecutor执行器的处理流程:
(1)当线程池大小小于corePoolSize就新建线程,并处理请求.
(2)当线程池大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理.
(3)当workQueue放不下新入的任务时,新建线程加入线程池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理.
(4)另外,当线程池的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁.


了解清楚了ThreadPoolExecutor的执行流程,开头提到的org.springframework.core.task.TaskRejectedException异常也就好理解和解决了.ThreadPoolTaskExecutor类中使用的
就是ThreadPoolExecutor.AbortPolicy()策略,直接抛出异常.

分享到:
评论
1 楼 jhy_wind 2014-04-10  
请问,你的mtrat插件是windows的吗?我在网上只找到了linux版。。。麻烦把你的插件发我一份吧(823930288@qq.com),万分感谢!!!
 

相关推荐

    Spring线程池ThreadPoolTaskExecutor配置详情

    ThreadPoolTaskExecutor的配置主要通过在Spring配置文件中定义一个名为taskExecutor的Bean来实现。下面是一个基本的配置示例: ```xml &lt;bean id="taskExecutor" class="org.springframework.scheduling.concurrent....

    spring线程池(同步、异步).docx

    在Spring框架中,线程池的使用是实现并发和异步任务执行的关键工具。线程池的概念源于Java的`java.util.concurrent.ExecutorService`接口,它允许我们管理一组可重用的工作线程,以提高系统效率并减少资源消耗。...

    spring 2.0中文参考手册

    Spring的TaskExecutor接口和ThreadPoolTaskExecutor类可以方便地实现异步任务和定时任务,这对于后台服务的自动化和定时运行非常有用。而RMI(Remote Method Invocation)支持则使得Spring应用能够跨网络进行分布式...

    Spring基于线程池的定时任务线挰异常实践

    在Spring的ThreadPoolTaskExecutor中,可以设置`errorHandler`属性来指定自定义的异常处理器。 此外,Spring的`@Async`注解也可以用来实现异步执行,但这与定时任务不同,它不涉及时间间隔,而是立即启动一个新的...

    spring-spring-framework-4.3.24.RELEASE.zip

    9. **任务调度**:Spring的Task模块提供了异步任务和定时任务的支持,包括SimpleAsyncTaskExecutor、ThreadPoolTaskExecutor以及ScheduledTaskRegistrar等。 10. **RESTful支持**:Spring MVC的Controller可以通过@...

    关于Spring中@Async注解使用

    Spring 中 @Async 注解的使用 @Async 注解是 Spring 框架提供的一种异步执行方法的实现方式,从 Spring 3.0 版本开始提供。使用 @Async 注解可以将方法标识为异步方法,通过 SimpleAsyncTaskExecutor 执行,但不...

    spring

    Spring的`ThreadPoolTaskExecutor`或`ConcurrentTaskExecutor`可以作为Quartz的执行器,以利用Spring的线程池管理功能。 总的来说,这个压缩包可能包含了一个完整的Spring项目,该项目演示了如何在Spring应用中配置...

    spring-batch分区处理示例

    3. **TaskExecutor**:Spring Batch支持多种类型的`TaskExecutor`,如SimpleAsyncTaskExecutor(基于线程池的异步执行)或ThreadPoolTaskExecutor(自定义线程池),用于并行执行子任务。 4. **Step实现**:每个...

    spring3和mybatis3的初始探索

    - 为了性能考虑,可以使用Spring的`ThreadPoolTaskExecutor`进行SQL批处理。 - 使用Spring的`@Scope("prototype")`注解避免单例模式下Mapper接口的线程安全问题。 总的来说,Spring3和MyBatis3的集成使得开发者...

    spring定时任务关键jar包(齐全)

    在Spring中,你可以通过配置`ThreadPoolTaskExecutor`或`SimpleAsyncTaskExecutor`来实现异步任务的执行。 2. **Spring TaskScheduler**: `TaskScheduler`接口是Spring提供的另一个核心组件,用于计划周期性的任务...

    HttpClient+ Spring实现多线程

    &lt;bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"&gt; ``` 然后,可以在需要发起HTTP请求的业务逻辑中注入这个线程池,异步执行任务: ```...

    springmvc+spring线程池处理http并发请求数据同步控制问题

    在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 一、Spring MVC与并发处理 1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将...

    spring异步调用的例子

    在Spring框架中,异步调用是一种提升应用性能和响应速度的重要技术。它允许你在不阻塞当前线程的情况下执行耗时的操作,从而提高系统的并发处理能力。本示例将探讨如何在Spring中实现异步调用,并通过具体的例子帮助...

    spring boot注解事务+多线程

    在Spring Boot应用中,事务管理和多线程是两个非常关键的特性,特别是在处理复杂的业务逻辑时。本示例将深入探讨如何使用注解来实现事务控制以及如何在Spring Boot中运用多线程。 首先,让我们关注"注解事务"。在...

    spring 多线程队列执行

    在Spring中,我们通常使用`ThreadPoolTaskExecutor`来创建一个线程池,它是一个实现了`java.util.concurrent.Executor`接口的Spring组件。线程池可以有效管理线程资源,避免频繁创建和销毁线程带来的开销。通过配置...

    java中spring里实现多线程

    在Java编程中,Spring框架是企业级应用开发的首选,它提供了一整套服务和支持,包括依赖注入、AOP(面向切面编程)、事务管理等。当我们谈到在Spring中实现多线程,实际上是在讨论如何在Spring环境中创建、管理和...

    spring2.5 定时器任务

    在Spring框架2.5版本中,提供了强大的定时任务管理功能,支持多种方式来实现定时任务的调度与执行。这为开发人员提供了一个灵活且易于集成的解决方案,使得应用程序能够按照预定的时间间隔或特定时间点执行某些任务...

    maven管理的Spring多线程任务demo

    为了在Spring中使用`ThreadPoolTaskExecutor`,我们需要在配置类中声明一个bean,如下所示: ```java @Configuration public class ThreadPoolConfig { @Bean(name = "threadPoolTaskExecutor") public ...

    Spring实现任务调度.rar

    本资料“Spring实现任务调度”将深入探讨如何在Spring中设置和管理定时任务。 首先,我们需要理解Spring中的任务调度机制。Spring通过其`Task`模块提供了任务调度的功能,主要由两个核心组件构成:`TaskExecutor`和...

    Spring的多线程应用

    在【描述】中提到的"一个简单的spring的多线程demo",我们可以理解为一个示例项目,旨在帮助开发者理解如何在Spring中实现和管理多线程。 在Java中,多线程主要用于提高应用程序的执行效率,尤其是在处理I/O密集型...

Global site tag (gtag.js) - Google Analytics