spring-线程池(1)
多线程并发处理起来通常比较麻烦,如果你使用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)的更多相关文章
- Spring线程池开发实战
Spring线程池开发实战 作者:chszs,转载需注明. 作者博客主页:http://blog.csdn.net/chszs 本文提供了三个Spring多线程开发的例子,由浅入深,由于例子一目了然, ...
- Spring线程池配置模板设计(基于Springboot)
目录 线程池配置模板 基础的注解解释 常用配置参数 配置类设计 线程池使用 ThreadPoolTaskExecutor源码 线程池配置模板 springboot给我们提供了一个线程池的实现,它的底层 ...
- Spring线程池ThreadPoolTaskExecutor配置及详情
Spring线程池ThreadPoolTaskExecutor配置及详情 1. ThreadPoolTaskExecutor配置 <!-- spring thread pool executor ...
- 分享知识-快乐自己:Spring线程池配置
Spring通过ThreadPoolTaskExecutor实现线程池技术,它是使用jdk中的Java.util.concurrent.ThreadPoolExecutor进行实现. Spring 配 ...
- Spring线程池由浅入深的3个示例
作者博客主页:http://blog.csdn.net/chszs 本文提供了三个Spring多线程开发的例子,由浅入深,由于例子一目了然,所以并未做过多的解释.诸位一看便知. 前提条件: 1)在Ec ...
- 【SSM Spring 线程池 OJ】 使用Spring线程池ThreadPoolTaskExecutor
最近做的Online Judge项目,在本地判题的实现过程中,遇到了一些问题,包括多线程,http通信等等.现在完整记录如下: OJ有一个业务是: 用户在前端敲好代码,按下提交按钮发送一个判题请求给后 ...
- spring线程池的同步和异步(1)
spring线程池(同步.异步) 一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent ...
- 007-多线程-JUC线程池-Spring线程池配置、池子如何配置参数
一.概述 Spring通过ThreadPoolTaskExecutor实现线程池技术,它是使用jdk中的Java.util.concurrent.ThreadPoolExecutor进行实现. 1.1 ...
- JDK线程池和Spring线程池的使用
JDK线程池和Spring线程池实例,异步调用,可以直接使用 (1)JDK线程池的使用,此处采用单例的方式提供,见示例: public class ThreadPoolUtil { private s ...
- spring线程池配置
源自:http://zjriso.iteye.com/blog/771706 1.了解 TaskExecutor接口 Spring的TaskExecutor接口等同于java.util.concurr ...
随机推荐
- DC平衡双向控制解串器 转接IC GM8914:FPD-LINK III转LVTTL芯片
1 概述 GM8914型DC平衡双向控制解串器,其主要功能是实现将2.8Gbps高速串行数据转换成10或12位并行控制信号,并同步输出一路时钟信号:同时低速通道将芯片控制信息调制到高速差分信号上传输给 ...
- 4月6日--js生成随机数列
newarr=[1,2,3,4,5,6] function randomsort(a,b){ return Math.random()>0.5?-1:1;}//用Math.random()函数生 ...
- Struts 2 实现登录以及显示信息
---恢复内容开始--- 这个星期主要做了一个项目的开始,基于开始学习Struts2的框架首先要先做好Action的按钮 这是我一个Action的展示,chain中是把一个数据带着去跳转另一个网页中 ...
- JavaScript中数组类型的属性和方法
除了Object,Array类型应该是ECMAScript中最常用的类型了. ECMAScript的数组虽然也是数据的有序列表,但还是与其他语言中的数组有很大的区别.比如ECMAScript数组每一项 ...
- MySQL一个简单的存储过程demo
使用的工具是Navicat for MySQL. 首先创建一个学生表 mysql) ) ) auto_increment,age ) ) not null,primary key(s_no)); Qu ...
- hadoop、Storm该选哪一个
如果hadoop.Storm还感觉混要,那么此篇文章将帮助你把他们完全区分 可以带着下面问题来阅读本文章: 1.hadoop.Storm各是什么运算 2.Storm为什么被称之为流式计算系统 3.ha ...
- 核心J2EE模式 - 截取过滤器
核心J2EE模式 - 截取过滤器 背景 呈现层请求处理机制接收许多不同类型的请求,这些请求需要不同类型的处理.一些请求被简单转发到适当的处理程序组件,而其他请求必须在进一步处理之前进行修改,审核或未压 ...
- 输入一个数字n 如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数 写出一个函数
题目: 输入一个数字n 如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数 写出一个函数 首先,这道题肯定可以用动态规划来解, n为整数时,n的解为 n/2 的解加1 n为奇数时 ...
- AngularJS的过滤器$filter
过滤器(filter)主要用于数据的格式上,通过某个规则,把值处理后返回结果.例如获得数据集,可排序后再返回. ng内置的共有九种过滤器: currency 货币 使用currency可以将数字格式化 ...
- Android事件分发机制详解
事件分发机制详解 一.基础知识介绍 1.经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等 2 ...