多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了。spring封装了java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性,具体来说如何使用spring来处理并发事务:

1.了解 TaskExecutor接口

Spring的 TaskExecutor接口等同于java.util.concurrent.Executor接口。 实际上,它存在的主要原因是为了在使用线程池的时候,将对Java 5的依赖抽象出来。 这个接口只有一个方法execute(Runnable task),它根据线程池的语义和配置,来接受一个执行任务。最初创建TaskExecutor是为了在需要时给其他Spring组件提供一个线程池的抽 象。 例如ApplicationEventMulticaster组件、JMS的 AbstractMessageListenerContainer和对Quartz的整合都使用了TaskExecutor抽象来提供线程池。 当然,如果你的bean需要线程池行为,你也可以使用这个抽象层。

2. TaskExecutor接口的实现类

(1)SimpleAsyncTaskExecutor 类

这个实现不重用任何线程,或者说它每次调用都启动一个新线程。但是,它还是支持对并发总数设限,当超过线程并发总数限制时,阻塞新的调用,直到有位置被释放。如果你需要真正的池,请继续往下看。

(2)SyncTaskExecutor类

这个实现不会异步执行。相反,每次调用都在发起调用的线程中执行。它的主要用处是在不需要多线程的时候,比如简单的test case。

(3)ConcurrentTaskExecutor 类

这个实现是对 Java 5 java.util.concurrent.Executor类的包装。有另一个备选, ThreadPoolTaskExecutor类,它暴露了Executor的配置参数作为bean属性。很少需要使用 ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一个备选。

(4)SimpleThreadPoolTaskExecutor 类

这个实现实际上是Quartz的SimpleThreadPool类的子类,它会监听Spring的生命周期回调。当你有线程池,需要在Quartz和非Quartz组件中共用时,这是它的典型用处。

(5)ThreadPoolTaskExecutor 类

它不支持任何对 java.util.concurrent包的替换或者下行移植。Doug Lea和Dawid Kurzyniec对java.util.concurrent的实现都采用了不同的包结构,导致它们无法正确运行。 这个实现只能在Java 5环境中使用,但是却是这个环境中最常用的。它暴露的bean properties可以用来配置一个java.util.concurrent.ThreadPoolExecutor,把它包装到一个 TaskExecutor中。如果你需要更加先进的类,比如ScheduledThreadPoolExecutor,我们建议你使用 ConcurrentTaskExecutor来替代。

(6)TimerTaskExecutor类

这个实现使用一个TimerTask作为其背后的实现。它和SyncTaskExecutor的不同在于,方法调用是在一个独立的线程中进行的,虽然在那个线程中是同步的。

(7)WorkManagerTaskExecutor类

这个实现使用了 CommonJ WorkManager作为其底层实现,是在Spring context中配置CommonJ WorkManager应用的最重要的类。和SimpleThreadPoolTaskExecutor类似,这个类实现了WorkManager接口, 因此可以直接作为WorkManager使用。

3. 简单hellword

3.1 线程类

public class MessagePrinterTask implements Runnable {
private String message; public MessagePrinterTask() { }
public MessagePrinterTask(String message) {
this.message = message;
} public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(message);
}
}

3.1 线程管理工具类

import org.springframework.core.task.TaskExecutor;

public class TaskExecutorUtil {

    private TaskExecutor taskExecutor;
public TaskExecutor getTaskExecutor() {
return taskExecutor;
} public void setTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
} public void printMessages(Runnable r,int i) {
taskExecutor.execute(r);
System.out.println("add Thread:"+i);
} }

applicationContext.xml

<?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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 异步线程池 -->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心线程数 -->
<property name="corePoolSize" value="2" />
<!-- 最大线程数 -->
<property name="maxPoolSize" value="3" />
<!-- 队列最大长度 >=mainExecutor.maxSize -->
<property name="queueCapacity" value="10" />
<!-- 线程池维护线程所允许的空闲时间 -->
<property name="keepAliveSeconds" value="300" />
<!-- 线程池对拒绝任务(无线程可用)的处理
策略 --> <!-- 若不作该处理,当线程满了,队列满了之后,继续往下增加任务,则抛出异常,拒绝该任务 -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</property>
</bean> <bean id="taskExecutorUtil" class="TaskExecutorUtil">
<!-- <constructor-arg ref="taskExecutor" /> -->
<property name="taskExecutor" ref="taskExecutor" />
</bean> <!-- 托管线程 -->
<bean id="messagePrinterTask" class="MessagePrinterTask">
</bean> </beans>

测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
TaskExecutorUtil te = (TaskExecutorUtil)appContext.getBean("taskExecutorUtil"); for (int i = 0; i < 25; i++) {
MessagePrinterTask m=new MessagePrinterTask("Message" + i);
te.printMessages(m,i);
}
System.out.println("11111111111111111111111");
}
}

结果输出

add Thread:0
add Thread:1
add Thread:2
add Thread:3
add Thread:4
add Thread:5
add Thread:6
add Thread:7
add Thread:8
add Thread:9
add Thread:10
add Thread:11
add Thread:12
Message1
Message0
Message13
add Thread:13
Message12
add Thread:14
add Thread:15
add Thread:16
Message2
Message4
Message17
add Thread:17
Message3
add Thread:18
add Thread:19
add Thread:20
Message5
Message7
Message21
add Thread:21
Message6
add Thread:22
add Thread:23
add Thread:24
11111111111111111111111
Message9
Message8
Message10
Message14
Message15
Message11
Message18
Message19
Message16
Message22
Message23
Message20
Message24

解释:

1.因为线程类睡眠5秒,所以在5秒前add Thread增加了13个线程(3个最大线程+10个在队列中等候),由于在做了对了满了的策略(rejectedExecutionHandler),所以不会抛出异常,

其他线程等候加入队列

2.五秒后打印aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOgAAAB9CAIAAAAnYLjfAAAEuElEQVR4nO3dS3KkOhSEYa2LBWk9mvY+OtjHHbMY7qAK9DpAGYfNydb/jdo0rwhnqKCUhvDn738roCYQXCgiuJBEcCGpCO4cQ5jSsq7rui5pCiHOz51XtqQphOZk3stCPmEMJgd3SdM0Ta8gLCnGODkIxRzDlJYlTWVwlzS9f1rSRHTHVAc3zSmmZV1Smpe0BTcPb0V6ioU5OdbCOYbQb14u3Vc2D7T9hz38z9HLBwN+VxXcOK9LiinFOK9bcOeYk/Ea/97/6vNiLsxy/PJ+DnZZrFBvebhLDCYH9x2cLQvv4BajoDE49gNjt7AeXI+De3CgfcdGPhluB9YFd/f6uRn7Gq9Qmkl9Lyy2L+JXhLkfentGcB3dPeIJV8G9HNbM0XBfWNw9zXGLc758Lp0cqD0GqUUObhvAPcjlh3h/G5UTZC7Mg+uUUjRG3IMdlGlvVm0vKojwiJ6YgKjH1vOLEcD0eHC5w8Idj0z5Vh/2DLe4ga4CJBFcSCK4kERwIUmy1mhMvGEwirXGjFrjsLRrjbTDhiVaa9yCz3A7KuVa48q827hUa43FwRh1RyRZa6w2IrdDEqw18m0YHLTDGDRxx+PB5fYKd1BrhCS6CpBEcCGJ4ELSV4J7/pXtF1zMDX8XDYYB/Gxwu78kD13/4Qd8GlwKk8J+Z8RtkuohuBQmtVXBtSuIX5gmO2IFtyt4zTHEtO/WOFA/G3d9nhcoTKo6GHGrCuL2G7xYeKIPbuj3VP4FxrbBSdfxm6fUbl+dG1cK7tXB7SuIZVr237K58MzxpUJdGWt3dNR1/PA8r1GYVFUG16ogPhtcu8fw8XlenxyFSVVFcI8qiFXT+3jhmbvBNce9z8/zGoVJVfbNWVlB3D+u4zyfLzx2O7hm1/Hz8zwfUCsUJrUwcwZJBBeSCC4kEVxIIriQRHAhieBCkvunNebvcflmFZn/pzXeqM7g3+f7aY1NK8HJhwAccP20xrJC85redfAhABdcP63xdS775QK9F+x8P61xjiFY22N4zp/WWI/N5BYb509r5Osw2B5/6B1Xrrjj8eByBYA7eFojJNFVgCSCC0kEF5IILiS5rzUeTCRjcP5rjWfPVMSwfNcai/0SXJRc1xr7LYEX17XGcscEFyXftcY3gouW81rjyTEwNOe1RvOZisDz7TBqjbjj8eBSa8Qd1Bohia4CJBFcSCK4kMRLqCGJl1Abq/KcMv94CXW36hzDFCODtm+8hLpZlQawBl5C3Z7ZlBYuk/3jJdT17PPXs49H8BJq++qHaT3neAm1uSojrne8hNq8myO43jFzBkkEF5IILiQRXEgiuJBEcCGJWiMkUWssV63Pl/A7Rq2xDS5xlUCtkeBKotZ4dKlAv8Y1ao32qo4eyQ4LtcaDFYoOGhyi1mivWl63wCFqjeUFR3EwUusbM2eQRHAhieBCEsGFJIILSQQXkqg1QhK1Rmu6jq9y3aPWWK3KRK8Kao3lqry6Sga1xjr6U5q3/BNhz6g1tmP2Jy8XxuOoNbYj7n64H74Sx7dQa2z/AqK43mDE9YtaY303Z90LwiFmziCJ4EISwYUkggtJBBeSCC4kEVxIKoJbdgUcPcilKx+238A6OU/8qv8B9N8PbhnIQYsAAAAASUVORK5CYII=" alt="" />,然后继续addThread,打印message,注意当前最大线程执行是3个,,其余在队列等候,然后打印剩余线程aaarticlea/png;base64,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" alt="" />,111111111111是主线程

4、配置解释
当一个任务通过execute(Runnable)方法欲添加到线程池时:
1、 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
2、 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
3、如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
4、
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过
handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程
maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
5、 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

5. 线程类为 java.util.concurrent.ThreadPoolExecutor:

线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler) corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略 一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。 当一个任务通过execute(Runnable)方法欲添加到线程池时: 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。 也就是:处理任务的优先级为:
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。 unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。 workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务

spring-线程池(1)的更多相关文章

  1. Spring线程池开发实战

    Spring线程池开发实战 作者:chszs,转载需注明. 作者博客主页:http://blog.csdn.net/chszs 本文提供了三个Spring多线程开发的例子,由浅入深,由于例子一目了然, ...

  2. Spring线程池配置模板设计(基于Springboot)

    目录 线程池配置模板 基础的注解解释 常用配置参数 配置类设计 线程池使用 ThreadPoolTaskExecutor源码 线程池配置模板 springboot给我们提供了一个线程池的实现,它的底层 ...

  3. Spring线程池ThreadPoolTaskExecutor配置及详情

    Spring线程池ThreadPoolTaskExecutor配置及详情 1. ThreadPoolTaskExecutor配置 <!-- spring thread pool executor ...

  4. 分享知识-快乐自己:Spring线程池配置

    Spring通过ThreadPoolTaskExecutor实现线程池技术,它是使用jdk中的Java.util.concurrent.ThreadPoolExecutor进行实现. Spring 配 ...

  5. Spring线程池由浅入深的3个示例

    作者博客主页:http://blog.csdn.net/chszs 本文提供了三个Spring多线程开发的例子,由浅入深,由于例子一目了然,所以并未做过多的解释.诸位一看便知. 前提条件: 1)在Ec ...

  6. 【SSM Spring 线程池 OJ】 使用Spring线程池ThreadPoolTaskExecutor

    最近做的Online Judge项目,在本地判题的实现过程中,遇到了一些问题,包括多线程,http通信等等.现在完整记录如下: OJ有一个业务是: 用户在前端敲好代码,按下提交按钮发送一个判题请求给后 ...

  7. spring线程池的同步和异步(1)

    spring线程池(同步.异步) 一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent ...

  8. 007-多线程-JUC线程池-Spring线程池配置、池子如何配置参数

    一.概述 Spring通过ThreadPoolTaskExecutor实现线程池技术,它是使用jdk中的Java.util.concurrent.ThreadPoolExecutor进行实现. 1.1 ...

  9. JDK线程池和Spring线程池的使用

    JDK线程池和Spring线程池实例,异步调用,可以直接使用 (1)JDK线程池的使用,此处采用单例的方式提供,见示例: public class ThreadPoolUtil { private s ...

  10. spring线程池配置

    源自:http://zjriso.iteye.com/blog/771706 1.了解 TaskExecutor接口 Spring的TaskExecutor接口等同于java.util.concurr ...

随机推荐

  1. 使用python解数独

    偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...

  2. RHEL7对比RHEL6的主要变化

    RHEL7和RHEL6的主要变化 RHEL7和RHEL6的主要变化   RHEL7 RHEL6 文件系统 XFS EXT4 内核版本 3.10.x-x系列 2.6.x-x系列 内核名称 Maipo S ...

  3. 第三章 PL/SQL编程

    3.1 PL/SQL基础知识    3.1.1 什么是PL/SQL?        PL/SQL是结合Oracle过程语言和结构化查询语言的一种扩展语言        3.1.1.1 PL/SQL体系 ...

  4. MySQL 5.7贴心参数之 log_timestamps

    写在前面 使用 MySQL 的过程中,经常会有人碰到这么一个问题,看错误日志.慢查询日志的时候,时间总是和本地时间对不上,差了 8 个小时,这样分析起来就相对麻烦了一些. 新改进 对于不知道是什么原因 ...

  5. 深入tornado中的ioLoop

    本文所剖析的tornado源码版本为4.4.2 ioloop就是对I/O多路复用的封装,它实现了一个单例,将这个单例保存在IOLoop._instance中 ioloop实现了Reactor模型,将所 ...

  6. AngularJS入门教程:日期格式化

    AngularJS入门教程:日期格式化[转载] 本地化日期格式化: ({{ today | date:'medium' }})Nov 24, 2015 2:19:24 PM ({{ today | d ...

  7. 纯JS单页面赛车游戏代码分享

    分享一个以前写的小游戏,纯js游戏,代码很简单.欢迎大家来喷呦! 效果图: 代码展示://直接复制到html文件即可 支持IE9+版本 <!DOCTYPE html> <html&g ...

  8. office web apps 整合Java web项目

    之前两篇文章将服务器安装好了,项目主要的就是这么讲其整合到我们的项目中,网上大部分都是asp.net的,很少有介绍Java如何整合的,经过百度,终于将其整合到了我的项目中. 首先建个servlet拦截 ...

  9. 针对iPhone的pt、Android的dp、HTML的css像素与dpr、设计尺寸和物理像素的浅分析

    最近被一朋友问到:css中设置一DOM的height:65px,请问显示的高度是否和Android的65dp的元素等高?脑子里瞬间闪现了一堆的概念,如dpr,ppi,dp,pt等,然而想了一阵,浆糊了 ...

  10. Python学习之路-Day2-Python基础3

    Python学习之路第三天 学习内容: 1.文件操作 2.字符转编码操作 3.函数介绍 4.递归 5.函数式编程 1.文件操作 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个 ...