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 ...
随机推荐
- [Linux] PHP程序员玩转Linux系列-Nginx中的HTTPS
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- 文本挖掘预处理之向量化与Hash Trick
在文本挖掘的分词原理中,我们讲到了文本挖掘的预处理的关键一步:"分词",而在做了分词后,如果我们是做文本分类聚类,则后面关键的特征预处理步骤有向量化或向量化的特例Hash Tric ...
- java 基础知识七 装箱和拆箱
java 基础知识七 装箱和拆箱 数据类型可分为两大种,基本数据类型(值类型)和类类型(引用数据类型) 装箱:把基本类型用他们相对应的引用类型包装起来,使他们可以具有对象的特质 基本数据类型 ...
- js创建xml对象
js创建xml对象 //创建对象 function getDataXML() { var objTds = $("TEXTAREA"); var count = o ...
- 拍照、本地图片工具类(兼容至Android7.0)
拍照.本地图片工具类:解决了4.4以上剪裁会提示"找不到文件"和6.0动态授予权限,及7.0报FileUriExposedException异常问题. package com.hb ...
- Extjs6官方文档译文——应用架构简介(MVC,MVVM)
应用架构简介 Extjs 同时提供对于MVC和MVVM应用架构的支持.这两个架构方式共享某些概念,而且都旨在沿着逻辑层面划分应用程序代码.每种方法在选择如何划分应用组件上都有其各自的优势. 本指南的目 ...
- 多个git账号的SSH配置
一般使用git都只需要维持一个默认的git账户就可以打天下了. 但如果自己确实需要多个git账号的需求的话,就有必要配置多个ssh key了. 首先为生成多个ssh key ssh-keygen -t ...
- jDialects:一个从Hibernate抽取的支持70多种数据库方言的原生SQL分页工具
jDialects(https://git.oschina.net/drinkjava2/jdialects) 是一个收集了大多数已知数据库方言的Java小项目,通常可用来创建分页SQL和建表DDL语 ...
- 【原创】bootstrap框架的学习 第八课 -[bootstrap表单]
Bootstrap 提供了下列类型的表单布局: 垂直表单(默认) 内联表单 水平表单 吹着表单或基本表单 向父 <form> 元素添加 role="form". 把标签 ...
- hdu4417 Super Mario
Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability re ...