spring 线程池疑问?

哪位大神知道 spring封装的线程池 源码里面

ExecutorConfigurationSupport
成员变量
private ExecutorService executor;

ThreadPoolTaskExecutor类 继承ExecutorConfigurationSupport类

成员变量
private ThreadPoolExecutor threadPoolExecutor;
方法
protected ExecutorService initializeExecutor(
ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) {
BlockingQueue queue = createQueue(this.queueCapacity);
ThreadPoolExecutor executor = new ThreadPoolExecutor(this.corePoolSize, this.maxPoolSize, this.keepAliveSeconds, TimeUnit.SECONDS,queue, threadFactory, rejectedExecutionHandler);
if (this.allowCoreThreadTimeOut) {
executor.allowCoreThreadTimeOut(true);
}
this.threadPoolExecutor = executor;
return executor;
}

ThreadPoolTaskExecutor任务执行是采用的自身成员变量
private ThreadPoolExecutor threadPoolExecutor;

那么父类ExecutorConfigurationSupport的成员变量private ExecutorService executor;虽然初始化了,实际没有用到

请问这里面是什么原因?

ExecutorConfigurationSupport类初始化方法
public void initialize() {
if (logger.isInfoEnabled()) {
logger.info("Initializing ExecutorService " + (this.beanName != null ? " '" + this.beanName + "'" : ""));
}
if (!this.threadNamePrefixSet && this.beanName != null) {
setThreadNamePrefix(this.beanName + "-");
}
this.executor = initializeExecutor(this.threadFactory, this.rejectedExecutionHandler);
}
抽象方法由子类ThreadPoolTaskExecutor实现
protected abstract ExecutorService initializeExecutor(
ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler);

0

1个回答

父类中的executor 是用到的:
[code="java"] public void shutdown() {
if (logger.isInfoEnabled()) {
logger.info("Shutting down ExecutorService" + (this.beanName != null ? " '" + this.beanName + "'" : ""));
}
if (this.waitForTasksToCompleteOnShutdown) {
this.executor.shutdown();
}
else {
this.executor.shutdownNow();
}
}

[/code]
用于停止executor时使用

ThreadPoolExecutor是池化的Executor实现,我们可以实现其他的;

就像struts2的Action 与 ActionSupport一样,ActionSupport提供了如验证、国际化的功能,我们可以复用它,但不一定使用它

0
jinnianshilongnian
jinnianshilongnian 这个没遇到过 建议 try catch下 然后批量时通过 @RequiresNew开新事务插入 每次插入完毕记录下最后的id 方便查询
6 年多之前 回复
chenying998179
chenying998179 朋友 我还有一个问题想咨询一下 就是用hibernate或jdbctemplate做数据操作的时候 应为我有很大的数据量需要频繁插入(数据采集 入库 数据量百万 千万级添加) 用jdbctemplate我是做的批量插入 我的系统是web应用 运行在tomcat容器 我发现有时运行一两天后 后来的数据根本没有添加到数据库,查看 控制台 也没有抛出异常 重启tomcat后 又能够正常了 数据也能够添加到数据库 请问朋友 这是什么情况呢
6 年多之前 回复
chenying998179
chenying998179 嗯 java原生态的java.util.concurrency package内涵 还是很丰富的
6 年多之前 回复
jinnianshilongnian
jinnianshilongnian 我觉得 这个是编码的问题 不用太纠结
6 年多之前 回复
chenying998179
chenying998179 呵呵 谢谢 我是看java的原生态的线程池 想起spring对线程池封装 觉得那代码有点不解 故有此疑问
6 年多之前 回复
jinnianshilongnian
jinnianshilongnian 执行任务也是用的这个成员变量this.threadPoolExecutor public void execute(Runnable task) { Executor executor = getThreadPoolExecutor(); try { executor.execute(task); } catch (RejectedExecutionException ex) { throw new TaskRejectedException("Executor [" + executor + "] did not accept task: " + task, ex); } } 子类定义一个threadPoolExecutor就想使用池的信息。 我觉得这种问题不用纠结,两者都行; Executor executor = getThreadPoolExecutor(); 换成你说的也许 没什么不可
6 年多之前 回复
chenying998179
chenying998179 您好 我们又见面了 谢谢您的解答 可是ThreadPoolTaskExecutor类实际是调用的自身的成员变量 它并没有调用父类ExecutorConfigurationSupport的成员变量private ExecutorService executor; 下面是ThreadPoolTaskExecutor类的方法 public ThreadPoolExecutor getThreadPoolExecutor() throws IllegalStateException { Assert.state(this.threadPoolExecutor != null, "ThreadPoolTaskExecutor not initialized"); return this.threadPoolExecutor; } 执行任务也是用的这个成员变量this.threadPoolExecutor public void execute(Runnable task) { Executor executor = getThreadPoolExecutor(); try { executor.execute(task); } catch (RejectedExecutionException ex) { throw new TaskRejectedException("Executor [" + executor + "] did not accept task: " + task, ex); } } 那么这里我不解的是 父类ExecutorConfigurationSupport的成员变量private ExecutorService executor; 虽然有它的初始化 销毁方法 可是实际上没有用到?
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
线程池疑问
最近我在做一个通信的程序,有师兄提议用线程池处理比较方便,但是我查了很多先有的中文版的C#的书,发现关于线程池的讲解都非常浅显,我想深入了解一下其中的知识,不知道哪位高人可以就线程池的相关知识做个详细的介绍或者推荐一下相关的著作,谢了先
Spring线程池
Spring线程池  ThreadPoolTaskExecutor applicationContext.xml配置如下: <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 属性字段说明:  cor
spring 线程池
spring4 线程池:把需要执行的Thread放入线程池中:缓冲队列 &amp;lt;!-- spring线程池 --&amp;gt; &amp;lt;bean id=&quot;taskExecutor&quot; class=&quot;org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor&quot;&amp;gt;  &amp;lt;!-- 线程池维护线程的最少数量 --&amp;gt;  &amp;lt...
spring线程池
spring线程池 SpringFrameWork 的 ThreadPoolTaskExecutor 是辅助 JDK 的 ThreadPoolExecutor 的工具类,它将属性通过 JavaBeans 的命名规则提供出来,方便进行配置。 Spring中的ThreadPoolTaskExecutor是借助于JDK并发包中的java.util.concurrent.ThreadPoolExecu...
Spring 线程池
问题如下:rnthreadPool.execute(thread)rnthreadPool和thread都是spring注入进来的rn但是一般threadPool.execute(new Thread())一般都是new 一个thread,每次的thread都是一个新的rnthreadPool.execute(thread)是在for里面,thread这个线程里面也有spring注入的东西rn像我这样每次for都是同一个threadrn会不会有问题?rn有什么办法解决rn
Spring线程池和自定义线程池的使用
1、下面是自定义的线程池的代码public class SettThreadPoolExecutor { private static final Log LOG = LogFactory.getLog(SettThreadPoolExecutor.class); /** * 针对核心Thread的Max比率 ,以10为基数,8表示0.8 */ priva
线程池(ThreadPool)一个疑问
谁能解释线程池(ThreadPool)的默认线程是开的多少,介绍下线程池的工作特性呢?以及如何通过程序来捕获这些
boost中线程池的疑问
今天看了看boost的线程池,有一个疑问rnrn1、我在使用线程池中,希望能够控制池子的总大小,比如boost::pool<> p(4096)。我希望p池子总共只能使用128Mb内存,该如何处理?rnrn2、如何在使用过程中知道,池子目前到底已经从操作系统申请了多少内存?rnrn3、如何在池子构造的过程中,就分配好内存。比如1中,我一开始就很明确自己需求128Mb内存,如何一下子申请好,免得每次申请产生碎片?
关于windows线程池的疑问
《windows核心编程》里提到,用_beginthreadex 代替 CreateThread,不然容易造成内存泄露。rn如果这样,那么windows提供的线程池不是同样会存在相同的问题?因为线程池里如果调用运行时库函数,rn当线程退出时同样会造成内存泄露。有没有运行时库版本的线程池啊?
完成端口与线程池的几点疑问
最近在看一些关于如何提升Socket服务器性能的资料,看到完成端口模型,给我的第一感觉就是方便易用,虽然做的初始化工作可能有点多,当然线程池也是我关注的一点,上网看了一些相关的帖子之后,发现不少人使用完成端口模型来实现自己的线程池,那我就有如下疑问了:rn1、完成端口本身就是利用重叠IO的思想基于同步消息队列以及线程池技术来实现这么一个“生产者-消费者”模型,既然它已经是对线程池的一个封装了,为何还有人利用完成端口模型来构建线程池呢?利用完成端口,已经完全可以实现跟使用线程池相同的效率了,我怎么感觉是多此一举,当然也许是我的理解有误。rn2、目前我正在做一个Socket通信服务器,客户端应该有5000~10000个左右,基于完成端口做的,我在工作者线程中收取到客户端发送的数据之后是直接做业务处理的(业务处理也在工作者线程中),但是有的业务处理需要较长的处理时间,并且一旦客户端的请求数量突发性的增大,那么服务器的响应性就非常差了,虽然可以通过设置增加工作者线程数量以及并发线程数量来提高一定的响应性,但是这个值是难以确定的,小弟在此请教各位,该如何设计才能在尽量减少内存消耗的前提下提高服务器的吞吐能力呢?
Java线程池的疑问
阅读《Java编程思想》第四版,根据书上的代码创建线程池。 ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i &amp;lt; count; i++) { executorService.execute(new Eve...
CSocket线程池的疑问。
Server接收到一个Client的发送数据事件Send时,就查找线程池是否有线程存在,如果有就取出一个线程与这个连接相绑定,来处理revc和send,函数使用完,就把它们解绑定,并把这个线程重新放回线程池。rn但有一个我想不明白的是,Client发出Send事件时,Server怎样获得Client的Send事件,来取出一个线程与之相绑定。如果能解决这个问题,就解决了CSocket线程池了。rn希望有人能帮忙解决一下。
线程池的阻塞队列泛型参数疑问
new LinkedBlockingQueuern泛型参数为Runnable,但是却可以添加Callable,编译和运行时都没有报错,这是为什么?
java自带线程池疑问
下面是网上看到的一个java自带的线程池的使用例子。运行结果在后面,结果显示有几个线程放置后未运行,我在自己的程序中使用java自带线程池,也有问题,也有多个线程内容重复的问题。不知这是为什么。rnrn[code=Java]rnpublic class TestThreadPool rnrn private static int produceTaskSleepTime = 2;rn private static int produceTaskMaxNumber = 10;rnrn public static void main(String[] args) rn//构造一个线程池rn ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3, TimeUnit.SECONDS,rn new ArrayBlockingQueue(3),rn new ThreadPoolExecutor.DiscardOldestPolicy());rnrn for (int i = 1; i <= produceTaskMaxNumber; i++) rn try rn //产生一个任务,并将其加入到线程池rn String task = "task@ " + i;rn System.out.println("放置 " + task);rn threadPool.execute(new ThreadPoolTask(task));rn //便于观察,等待一段时间rn Thread.sleep(produceTaskSleepTime);rn catch (Exception e) rn e.printStackTrace();rn rn rn rnrnrnclass ThreadPoolTask implements Runnable, Serializable rnrn private static int consuskSleepTime = 2000;rn private static final long serialVersionUID = 0;rn //保存任务所需要的数据rn private Object threadPoolTaskData;rnrn ThreadPoolTask(Object tasks) rn this.threadPoolTaskData = tasks;rn rnrn @Overridern public void run() rn System.out.println("开始 .." + threadPoolTaskData);rn try rn ////便于观察,等待一段时间rn Thread.sleep(consuskSleepTime);rn catch (Exception e) rn e.printStackTrace();rn rn threadPoolTaskData = null;rn rnrn public Object getTask() rn return this.threadPoolTaskData;rn rnrn[/code]rnrnrun:rn放置 task@ 1rn开始 ..task@ 1rn放置 task@ 2rn开始 ..task@ 2rn放置 task@ 3rn放置 task@ 4rn放置 task@ 5rn放置 task@ 6rn开始 ..task@ 6rn放置 task@ 7rn开始 ..task@ 7rn放置 task@ 8rn放置 task@ 9rn放置 task@ 10rn开始 ..task@ 8rn开始 ..task@ 9rn开始 ..task@ 10rn成功生成(总时间:8 秒)rn
关于完成端口+线程池的疑问?
我把 完成端口+线程池技术 封装成了一个类 IOCPServer。rnrn现在我在程序中调用了此类一个异步接收请求函数(封装的WSARecv),但此异步IO请求完成通知是放在IO完成队列,然后通过工作者线程进行处理的。rnrn请问我的主调函数怎么能获得完成通知呢?或者说工作者线程收到了完成通知,它如何通知给我的主调函数?
Spring疑问
1.Spring什么情况可以在类上添加@RequestMapping(&quot;????&quot;)映射?
Spring 疑问
我想通过Spring AOP实现日志功能,及在每个类的每个方法开始调用和退出时,打印日志。rn但是,我发现一个问题,同一个类中的方法A调用方法B时,确不能在方法B调用植入日志。rnrn代码如下:rn1) 需要植入日志的类 aop.AopTestrn[code=Java]rnpublic class AopTest rn private static final Logger logger = Logger.getRootLogger();rnrn public void methodA() rn logger.debug("AopTest.methodA()");rn rn rn public void methodB() rn logger.debug("AopTest.methodB()");rn rn rn public void methodAB() rn logger.debug("AopTest.methodAB()");rn methodA();rn methodB();rn rnrn[/code]rnrn2) interceptor, aop.InterceptorTestrn[code=Java]rnpublic class InterceptorTest rn private static final Logger logger = Logger.getRootLogger();rnrn public void startInvoke(JoinPoint joinPoint) rn String methodName = String.format("%s.%s", joinPoint.getSignature().getDeclaringTypeName()rn , joinPoint.getSignature().getName() );rn logger.debug("startInvoke ----------------->[" + methodName + "]");rn rn rn public void endInvoke(JoinPoint joinPoint) rn String methodName = String.format("%s.%s", joinPoint.getSignature().getDeclaringTypeName()rn , joinPoint.getSignature().getName() );rn logger.debug("endInvoke *******************>[" + methodName + "]");rn rnrn[/code]rnrn3) Spring 配置文件 ApplicationContext.xmlrn[code=XML]rnrnrn rn rn rnrn rn rn rn rn rn rn rn rn rnrn[/code]rnrn4) 测试代码 main.Mainrn[code=Java]rnpublic class Main rn public static final ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");rnrn public static void main(String[] args) rn AopTest aopTest = (AopTest)ctx.getBean("aopTest");rn aopTest.methodAB();rn aopTest.methodA();rn aopTest.methodB();rn rnrn[/code]rnrn5) 运行输出rn程序运行后,输入如下:rnrn[DEBUG]startInvoke ----------------->[aop.AopTest.methodAB]rn[DEBUG]AopTest.methodAB()rn[DEBUG]AopTest.methodA()rn[DEBUG]AopTest.methodB()rn[DEBUG]endInvoke *******************>[aop.AopTest.methodAB]rn[DEBUG]startInvoke ----------------->[aop.AopTest.methodA]rn[DEBUG]AopTest.methodA()rn[DEBUG]endInvoke *******************>[aop.AopTest.methodA]rn[DEBUG]startInvoke ----------------->[aop.AopTest.methodB]rn[DEBUG]AopTest.methodB()rn[DEBUG]endInvoke *******************>[aop.AopTest.methodB]rnrn6) 但实际上,我想要的输出是:rn[DEBUG]startInvoke ----------------->[aop.AopTest.methodAB]rn[DEBUG]AopTest.methodAB()rn[color=#FF0000][DEBUG]startInvoke ----------------->[aop.AopTest.methodA][/color]rn[DEBUG]AopTest.methodA()rn[color=#FF0000][DEBUG]endInvoke *******************>[aop.AopTest.methodA][/color]rn[color=#FF0000][DEBUG]startInvoke ----------------->[aop.AopTest.methodB][/color]rn[DEBUG]AopTest.methodB()rn[color=#FF0000][DEBUG]endInvoke *******************>[aop.AopTest.methodB][/color]rn[DEBUG]endInvoke *******************>[aop.AopTest.methodAB]rn[DEBUG]startInvoke ----------------->[aop.AopTest.methodA]rn[DEBUG]AopTest.methodA()rn[DEBUG]endInvoke *******************>[aop.AopTest.methodA]rn[DEBUG]startInvoke ----------------->[aop.AopTest.methodB]rn[DEBUG]AopTest.methodB()rn[DEBUG]endInvoke *******************>[aop.AopTest.methodB]rnrn[color=#FF0000]红色[/color]的文字为,缺少的输出rnrn问题是:rn1) 为什么会这样?rn2) 怎样在不改动源代码 aop.AopTest.java和aop.InterceptorTest.java的情况下,实现我期待的输出?
spring疑问
刚开始转入jsp里rn做网站mvc思想,分层,有人告诉我用spring,这两天查了下相关文章rn看了下,rn有几个问题rn1 单独的spring框架不可以做出来mvc的网站吗?rn2 现在一般是spring,struts,hibernate这三个一起使用吗(我用myeclipse工具)rnrn其他问题rn3 servelet这个我还没看,影响对框架的使用吗?
spring 疑问
现在用的是SSI框架,但在开发中遇到一些疑惑,希望高手给予解答。rn因为是ssi的框架,项目在web.xml中定义了监听器,用于项目启动的时候就加载所有的beanrnrn[code="xml"]rnrn contextConfigLocationrn classpath*:/config/spring/applicationContext.xmlrn rnrn rn org.springframework.web.context.ContextLoaderListenerrn rn[code="xml"]rnrnrnrn但项目中有些类中,需要注入,一时想不出来好方法,就用了读取配置文件的方法,如下rnApplicationContext ctx = ClassPathXmlApplicationContext("配置文件");rn但在配置定时器的时候发生了产生两个实例的问题;rnrn我想问一下,rn第一个问题:每次像ApplicationContext ctx = ClassPathXmlApplicationContext("配置文件");调用就重新实例话所有的bean,还是再次产生多个bean,造成多了一倍;这样做是不是会造成实例越来越多?rn第二个问题,怎么查看项目启动后所有的已经实例化的bean?rnrnrn
spring mvc 加入线程池
// 注入线程池 @Autowired private ThreadPoolTaskExecutor taskExecutor;   // 执行线程 taskExecutor.execute (new Runnable () {   @Override   public void run() {     System.out.println ("===== hello world"
spring线程池配置
<!-- 配置线程池 异步线程池 --> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 线程池维护线程的最少数量 --> <property name="corePoolSize" valu
Spring Boot之线程池
在写框架的时候需要用到线程池,记录下使用方式ExecutePool配置,开启@EnableAsync支持异步任务@Configuration @EnableAsync public class ExecutorPool { private int corePoolSize = 10; private int maxPoolSize = 50; private int q...
spring管理线程池
sping配置&amp;lt;!-- Thread Pool --&amp;gt; &amp;lt;bean id=&quot;taskExecutor&quot; class=&quot;org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor&quot;&amp;gt; &amp;lt;!-- 线程池活跃的线程数 --&amp;gt; ...
spring线程池管理
&amp;lt;!-- spring线程池 --&amp;gt; &amp;lt;bean id = &quot;task&quot; class=&quot;org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor&quot;&amp;gt; &amp;lt;!-- 线程池维护线程的最少数量 --&amp;gt; &amp;lt;property name=&quot;corePoolSi...
SPRING中的线程池
(记录一句:用多线程处理和消息队列来处理大数据量操作,文件操作,或者并发。) 多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了。spring封装了Java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性,具体来说如何使用spring来处理并发事务:1.了解 TaskExecutor接口Spring的TaskExecutor接口等同于
Spring线程池配置
Spring通过ThreadPoolTaskExecutor实现线程池技术,它是使用jdk中的Java.util.concurrent.ThreadPoolExecutor进行实现。Spring 配置线程池,有两种方式:方式一:XML定时ThreadPoolTaskExecutor bean形式<!-- Spring线程池 --> <bean id="taskExecutor" class="org
Spring AMPQ自定义线程池
在项目中遇到了一个棘手的问题。当多个消费者同时执行任务的时候出现了资源争用的问题。日志如下 19-03-19 13:00:17.470 [SimpleAsyncTaskExecutor-1] INFO c.w.m.h.AbstractMessageHandler - 开始验证消息:f3eaa048d8984c2aa69b52a8cdece1e9 19-03-19 13:00:17.470 [Si...
Spring中线程池的用法
多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了。spring封装了java的多线程的实现,简化了开发。 简单的Hello程序需要执行的线程类一般是对于业务的封装.将具体的业务逻辑放到,线程内执行。public class MessagePrinterTask implements Runnable { private String messag
ActiveMQ与Spring线程池的整合
转自:http://www.g4studio.org/thread-880-1-1.html ActiveMQ与Spring线程池的整合在企业级开发中,很多系统间的通信,特别是与外部系统间的通信,往往都是异步的,JMS便是J2EE应用程序中用于处理异步消息传递的接口。为了提高对外部消息的相应,服务器程序中往往利用线程技术来处理接收的消息,线程池的意义在于对这样的一个并行处理机制进行性能上的优化。...
Spring线程池的使用demo
Spring线程池的使用 线程阻塞的技术,主线程等待子线程执行完毕再执行。传统的是join.spring采用了invokeAll();
Spring线程池demo
Spring 线程池 demo
关于spring 线程池
spring 线程池ThreadPoolTaskExecutor  &amp;lt;bean id =&quot;taskExecutor&quot;  class =&quot;org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor&quot; &amp;gt;       &amp;lt;!-- 线程池维护线程的最少数量 --&amp;gt;   &amp;lt;property name...
spring 事物 线程池 测试
static ExecutorService executorService = Executors.newFixedThreadPool(1); public List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; queryForListMap(final String sql) throws Exception { /*new Thread...
Spring线程池的使用
地址:http://zjriso.iteye.com/blog/771706 1.了解 TaskExecutor接口 Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口。实际上,它存在的主要原因是为了在使用线程池的时候,将对Java 5的依赖抽象出来。这个接口只有一个方法execute(Runnable task),它根据...
Spring:异步线程池和定时器
一、异步线程池 在Spring中存在一个AsyncConfigurer接口,它是一个可以配置异步线程池的接口,它的源码如下: package org.springframework.scheduling.annotation; import java.util.concurrent.Executor; import org.springframework.aop.interceptor.A...
Spring 线程池使用
Spring 中默认自带线程池org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor,一般有可以直接使用,这是时候使用的是默认的配置,直接使用@Autowired注入使用     @Autowired     private ThreadPoolTaskExecutor poolTaskExecutor; packag...
spring学习----线程池
简介创建和销毁线程需要时间、资源 线程池可以达到这样的效果:一个线程执行完任务之后,继续去执行下一个任务,不被销毁,这样线程利用率提高了。 参数 corePoolSize:线程池的大小。线程池创建之后不会立即去创建线程,而是等待线程的到来。当当前执行的线程数大于改值是,线程会加入到缓冲队列; maximumPoolSize:线程池中创建的最大线程数; keepAliveTime:空闲的线程多久时