飞的网店,康熙来了121225,beztoma
分享一下最近优锐课学习笔记。
java线程池执行程序偏向于排队而不是产生新线程。从好的方面来说,我们有两种解决方法。
理想情况下,对任何线程池执行程序而言,期望如下:
下图描述了该过程;仅创建初始线程来处理任务(负载很低时)。
随着更多的任务进入,假设创建的线程总数小于最大池大小,则会创建更多的线程来处理负载(任务队列仍然为空)。
如果任务总数大于线程总数(初始+扩展),则任务队列开始填充:
不幸的是,java线程池执行器(tpe)偏向于排队而不是生成新线程,即,在初始核心线程被占用之后,任务被添加到队列中,并且在队列达到其限制之后(这只会在有界队列中发生) ),则会产生额外的线程。如果队列不受限制,则完全不会产生扩展线程,如下图所示。
这是tpe中的代码,出现了问题
我们有两种解决方法:
将corepoolsize 和maximumpoolsize设置为相同的值,并将allowcorethreadtimeout 设置为true。
实现自定义rejectedexecutionhandler以始终添加到位数中。
使用自定义队列(transferqueue)并覆盖offer方法以执行以下操作:
使用专门用于此目的的自定义线程池执行程序。它使用系统@ facebook规模中所述的lifo调度。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
浅析我对 String、StringBuilder、StringBuffer 的理解
使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)
Springboot整合freemarker 404问题解决方案
引入mybatis-plus报 Invalid bound statement错误问题的解决方法
网友评论