多线程并发处理起来通常比较麻烦,如果你使用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 线程类

  1. public class MessagePrinterTask implements Runnable {
  2. private String message;
  3.  
  4. public MessagePrinterTask() {
  5.  
  6. }
  7. public MessagePrinterTask(String message) {
  8. this.message = message;
  9. }
  10.  
  11. public void run() {
  12. try {
  13. Thread.sleep(5000);
  14. } catch (InterruptedException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. }
  18. System.out.println(message);
  19. }
  20. }

3.1 线程管理工具类

  1. import org.springframework.core.task.TaskExecutor;
  2.  
  3. public class TaskExecutorUtil {
  4.  
  5. private TaskExecutor taskExecutor;
  6. public TaskExecutor getTaskExecutor() {
  7. return taskExecutor;
  8. }
  9.  
  10. public void setTaskExecutor(TaskExecutor taskExecutor) {
  11. this.taskExecutor = taskExecutor;
  12. }
  13.  
  14. public void printMessages(Runnable r,int i) {
  15. taskExecutor.execute(r);
  16. System.out.println("add Thread:"+i);
  17. }
  18.  
  19. }

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  11. <!-- 异步线程池 -->
  12. <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  13. <!-- 核心线程数 -->
  14. <property name="corePoolSize" value="2" />
  15. <!-- 最大线程数 -->
  16. <property name="maxPoolSize" value="3" />
  17. <!-- 队列最大长度 >=mainExecutor.maxSize -->
  18. <property name="queueCapacity" value="10" />
  19. <!-- 线程池维护线程所允许的空闲时间 -->
  20. <property name="keepAliveSeconds" value="300" />
  21. <!-- 线程池对拒绝任务(无线程可用)的处理
  22. 策略 --> <!-- 若不作该处理,当线程满了,队列满了之后,继续往下增加任务,则抛出异常,拒绝该任务 -->
  23. <property name="rejectedExecutionHandler">
  24. <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
  25. </property>
  26. </bean>
  27.  
  28. <bean id="taskExecutorUtil" class="TaskExecutorUtil">
  29. <!-- <constructor-arg ref="taskExecutor" /> -->
  30. <property name="taskExecutor" ref="taskExecutor" />
  31. </bean>
  32.  
  33. <!-- 托管线程 -->
  34. <bean id="messagePrinterTask" class="MessagePrinterTask">
  35. </bean>
  36.  
  37. </beans>

测试

  1. import org.springframework.context.ApplicationContext;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. /**
  4. * Hello world!
  5. *
  6. */
  7. public class App
  8. {
  9. public static void main( String[] args )
  10. {
  11. ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  12. TaskExecutorUtil te = (TaskExecutorUtil)appContext.getBean("taskExecutorUtil");
  13.  
  14. for (int i = 0; i < 25; i++) {
  15. MessagePrinterTask m=new MessagePrinterTask("Message" + i);
  16. te.printMessages(m,i);
  17. }
  18. System.out.println("11111111111111111111111");
  19. }
  20. }

结果输出

  1. add Thread0
  2. add Thread1
  3. add Thread2
  4. add Thread3
  5. add Thread4
  6. add Thread5
  7. add Thread6
  8. add Thread7
  9. add Thread8
  10. add Thread9
  11. add Thread10
  12. add Thread11
  13. add Thread12
  14. Message1
  15. Message0
  16. Message13
  17. add Thread13
  18. Message12
  19. add Thread14
  20. add Thread15
  21. add Thread16
  22. Message2
  23. Message4
  24. Message17
  25. add Thread17
  26. Message3
  27. add Thread18
  28. add Thread19
  29. add Thread20
  30. Message5
  31. Message7
  32. Message21
  33. add Thread21
  34. Message6
  35. add Thread22
  36. add Thread23
  37. add Thread24
  38. 11111111111111111111111
  39. Message9
  40. Message8
  41. Message10
  42. Message14
  43. Message15
  44. Message11
  45. Message18
  46. Message19
  47. Message16
  48. Message22
  49. Message23
  50. Message20
  51. 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:

  1. 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:
  2.  
  3. ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
  4. long keepAliveTime, TimeUnit unit,
  5. BlockingQueue<Runnable> workQueue,
  6. RejectedExecutionHandler handler)
  7.  
  8. corePoolSize 线程池维护线程的最少数量
  9. maximumPoolSize:线程池维护线程的最大数量
  10. keepAliveTime 线程池维护线程所允许的空闲时间
  11. unit 线程池维护线程所允许的空闲时间的单位
  12. workQueue 线程池所使用的缓冲队列
  13. handler 线程池对拒绝任务的处理策略
  14.  
  15. 一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
  16.  
  17. 当一个任务通过execute(Runnable)方法欲添加到线程池时:
  18.  
  19. 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
  20.  
  21. 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
  22.  
  23. 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
  24.  
  25. 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
  26.  
  27. 也就是:处理任务的优先级为:
  28. 核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
  29.  
  30. 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
  31.  
  32. unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
  33. NANOSECONDSMICROSECONDSMILLISECONDSSECONDS
  34.  
  35. workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue
  36.  
  37. handler有四个选择:
  38. ThreadPoolExecutor.AbortPolicy()
  39. 抛出java.util.concurrent.RejectedExecutionException异常
  40. ThreadPoolExecutor.CallerRunsPolicy()
  41. 重试添加当前的任务,他会自动重复调用execute()方法
  42. ThreadPoolExecutor.DiscardOldestPolicy()
  43. 抛弃旧的任务
  44. ThreadPoolExecutor.DiscardPolicy()
  45. 抛弃当前的任务

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. DC平衡双向控制解串器 转接IC GM8914:FPD-LINK III转LVTTL芯片

    1 概述 GM8914型DC平衡双向控制解串器,其主要功能是实现将2.8Gbps高速串行数据转换成10或12位并行控制信号,并同步输出一路时钟信号:同时低速通道将芯片控制信息调制到高速差分信号上传输给 ...

  2. 4月6日--js生成随机数列

    newarr=[1,2,3,4,5,6] function randomsort(a,b){ return Math.random()>0.5?-1:1;}//用Math.random()函数生 ...

  3. Struts 2 实现登录以及显示信息

    ---恢复内容开始--- 这个星期主要做了一个项目的开始,基于开始学习Struts2的框架首先要先做好Action的按钮 这是我一个Action的展示,chain中是把一个数据带着去跳转另一个网页中 ...

  4. JavaScript中数组类型的属性和方法

    除了Object,Array类型应该是ECMAScript中最常用的类型了. ECMAScript的数组虽然也是数据的有序列表,但还是与其他语言中的数组有很大的区别.比如ECMAScript数组每一项 ...

  5. MySQL一个简单的存储过程demo

    使用的工具是Navicat for MySQL. 首先创建一个学生表 mysql) ) ) auto_increment,age ) ) not null,primary key(s_no)); Qu ...

  6. hadoop、Storm该选哪一个

    如果hadoop.Storm还感觉混要,那么此篇文章将帮助你把他们完全区分 可以带着下面问题来阅读本文章: 1.hadoop.Storm各是什么运算 2.Storm为什么被称之为流式计算系统 3.ha ...

  7. 核心J2EE模式 - 截取过滤器

    核心J2EE模式 - 截取过滤器 背景 呈现层请求处理机制接收许多不同类型的请求,这些请求需要不同类型的处理.一些请求被简单转发到适当的处理程序组件,而其他请求必须在进一步处理之前进行修改,审核或未压 ...

  8. 输入一个数字n 如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数 写出一个函数

    题目: 输入一个数字n  如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数  写出一个函数 首先,这道题肯定可以用动态规划来解, n为整数时,n的解为 n/2 的解加1 n为奇数时 ...

  9. AngularJS的过滤器$filter

    过滤器(filter)主要用于数据的格式上,通过某个规则,把值处理后返回结果.例如获得数据集,可排序后再返回. ng内置的共有九种过滤器: currency 货币 使用currency可以将数字格式化 ...

  10. Android事件分发机制详解

    事件分发机制详解 一.基础知识介绍 1.经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等 2 ...