赞
踩
当我们需要实现并发、异步等操作时,通常都会使用到ThreadPoolTaskExecutor
,现对其使用稍作总结。
ThreadPoolTaskExecutor通常通过XML方式配置,或者通过Executors
的工厂方法进行配置。
XML方式配置代码如下:
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="8"/> <!--核心线程数 -->
<property name="maxPoolSize" value="16"/> <!--最大线程数 -->
<property name="keepAliveSeconds" value ="3000"/> <!--线程最大空闲时间 -->
<property name="queueCapacity" value="200"/> <!-- 队列大小 -->
<property name="threadNamePrefix" value="TASK_EXECUTOR"/>
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy"/>
</property>
</bean>
rejectedExecutionHandler
字段用于配置拒绝策略,常用的拒绝策略如下:
execute
。其他说明:
RejectedExecutionHandler
接口即可。threadNamePrefix
属性,出问题时可以更方便的进行排查。execute(Runnable)
submit(Runnable)
在ThreadPoolExecutor中表现为:
调用shutdown或者shutdownNow,两者都不会接受新的任务,而且通过调用要停止线程的interrupt方法来中断线程,有可能线程永远不会被中断,不同之处在于shutdownNow会首先将线程池的状态设置为STOP,然后尝试停止所有线程(有可能导致部分任务没有执行完)然后返回未执行任务的列表。而shutdown则只是将线程池的状态设置为shutdown,然后中断所有没有执行任务的线程,并将剩余的任务执行完。
常用状态:
通过继承线程池,重写beforeExecute
,afterExecute
和terminated
方法来在线程执行任务前,线程执行任务结束,和线程终结前获取线程的运行情况,根据具体情况调整线程池的线程数量。
参考来源:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。