19. 用过spring的线程池还是java的线程池?

  SpingFrameWork的ThreadPoolTaskExecutor是辅助JDK的ThreadPoolExecutor的工具类,它将属性通过JavaBeans的命名规则提供出来,方便进行配置。接下来就讲讲ThreadPoolTaskExecutor的使用。

  最常用的方式就是作为BEAN注入到容器中

<bean id="threadPoolTaskExecutor"  
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
    <property name="corePoolSize" value="10" />  
    <property name="maxPoolSize" value="15" />  
    <property name="queueCapacity" value="1000" />  
</bean> 

  ThreadPoolExecutor执行器的处理流程: 
(1)当线程池大小小于corePoolSize就新建线程,并处理请求. 
(2)当线程池大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理. 
(3)当workQueue放不下新入的任务时,新建线程加入线程池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理. 
(4)另外,当线程池的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁. 


了解清楚了ThreadPoolExecutor的执行流程,开头提到的org.springframework.core.task.TaskRejectedException异常也就好理解和解决了.ThreadPoolTaskExecutor类中使用的 
就是ThreadPoolExecutor.AbortPolicy()策略,直接抛出异常. 

posted @ 2018-07-24 11:17  冷漠不是我的本意  阅读(2706)  评论(0编辑  收藏  举报