ThreadPoolTaskExecutor使用介绍转载
原创当我们需要实现并发、异步等时,我们通常使用ThreadPoolTaskExecutor,现在简要介绍一下它的用途。
配置
ThreadPoolTaskExecutor通常通过XML路配置,或Executors出厂方法已配置。
XML配置代码如下:
rejectedExecutionHandler该字段用于配置拒绝策略。常见的拒绝策略如下:
AbortPolicy被拒绝任务的处理程序,它将抛出。RejectedExecutionException。
CallerRunsPolicy,被拒绝任务的处理程序,直接位于execute被拒绝的任务在方法的调用线程中运行。
DiscardOldestPolicy,被拒绝任务的处理程序,它将丢弃最旧的未处理请求并重试。execute。
DiscardPolicy,是被拒绝任务的处理程序,默认情况下,该处理程序将丢弃被拒绝的任务。
其他说明:
为了实现某些特殊的业务需求,用户可以选择使用自定义策略,只需实现即可。RejectedExecutionHandler接口就足够了。
建议配置threadNamePrefix物业,出现问题时检查更方便。
提交任务
使用没有返回值的任务。execute(Runnable)
使用具有返回值的任务submit(Runnable)
处理流程
当任务提交到线程池时,首先检查线程池的核心线程是否都在执行任务,选择一个线程执行任务,然后执行第二步。
检查核心线程池是否已满,如果不满意,请创建一个线程来执行任务,否则执行第三步。
检查任务队列是否已满,如果不满意,请将任务存储在任务队列中,否则执行第四步。
要查看线程池是否已满,将创建一个线程来执行任务(如果不满足),否则将根据策略处理无法执行的任务。
在ThreadPoolExecutor中表现为:
如果当前运行的线程数较少corePoolSize,然后创建一个线程来执行任务(执行时需要获取全局锁)。
如果运行的线程大于或等于corePoolSize,然后放入task加入BlockQueue。
如果创建的线程数大于BlockQueue最大容量,然后创建一个新线程来执行任务。
如果创建线程导致当前运行的线程数超过maximumPoolSize,根据饱和策略拒绝任务。
关闭线程池
调用shutdown或者shutdownNow,两者都不会接受新任务,并通过调用线程停止。interrupt方法来中断线程,则线程可能永远不会被中断,区别在于shutdownNow首先设置线程池的状态STOP,然后尝试停止所有线程(这可能导致某些任务未执行),然后返回未执行任务的列表。和shutdown然后只需设置线程池的状态shutdown,然后中断所有未执行任务的线程并完成剩余任务。
配置线程数
如果是CPU密集的任务,那么线程池中的线程数量通常应该尽可能少CPU的个数+1条线程。
如果是IO密集的任务,那么线程池中的线程可以放置得非常大,例如2*CPU的个数。
对于混合任务,如果您可以拆分它们,请拆分它们CPU密集型和IO两种强化以提高执行效率;如果无法拆分,可以根据实际情况调整线程池中的线程数。
监视线程池状态
常见状态:
taskCount:线程需要执行的任务数。
completedTaskCount:线程池在运行期间完成的任务数。
largestPoolSize:线程池创建的最大线程数。
getPoolSize获取当前线程池中的线程数。
getActiveCount:获取活动的线程数。
通过继承线程池,重写beforeExecute,afterExecute和terminated方法获取线程执行任务之前线程的运行状态,然后线程终止,并根据具体情况调整线程池中的线程数。
参考来源:
作者:楚星
来源:CSDN
原文:https://blog.csdn.net/foreverling/article/details/78073105
版权声明:本文为博主原创文章。转载请附上博客链接!
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除