线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数

摘要:
运行五个线程:运行八个线程:执行九个线程:从中可以看出,最大线程数是:同时执行的最大线程数+任务队列数。如果超过了最大线程数,请直接运行拒绝策略。添加服务器是第二步。有关线程池的设置,请参阅2。

根据阿里巴巴开发手册:

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第1张

我们线程池使用ThreadPoolExecutor的方式进行创建,下面看底层源码:

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第2张

有七个参数:

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第3张

现在创建它:核心线程数2,同时执行的最大线程数5,多余线程存活时间1L,单位秒,阻塞队列3,默认线程工厂,拒绝策略

创建线程池:

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第4张

第一种拒绝策略:AbortPolicy:超出最大线程数,直接抛出RejectedExecutionException异常阻止系统正常运行。 

运行五个线程:

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第5张

 运行八个线程:

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第6张

运行9个线程:

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第7张

由此可以看出最大线程数为:同时执行的最大线程数+任务队列(阻塞队列)数,超过了最大线程数直接运行拒绝策略。

第二种拒绝策略:

“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。(谁调用了你,到达最大线程数时,你回去找调用你的人,然后听从调用你的人安排)(超出的我们能办的给你办,不能办的给你回退 )

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第8张

第三拒绝策略:DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第9张

第四种拒绝策略:DiscardPolicy:直接丢弃任务,不予任何处理也不抛异常,如果允许任务丢失这是最好的一种方案。

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第10张

线程池配置合理线程数

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第11张

查看机器的核心数

 线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第12张

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第13张 
------------------------

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第14张

线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数第15张

CPU密集型:cpu的核数+1,这样可以尽量减少切换 IO密集型:cpu的核数*10(一般阻塞系统是0.9)

业务场景:

1:高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换

2:并发不高、任务执行时间长的业务这就需要区分开看了:

a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以适当加大线程池中的线程数目,让CPU处理更多的业务

b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换

(其实从一二可以看出无论并发高不高,对于业务中是否是cpu密集还是I/O密集的判断都是需要的当前前提是你需要优化性能的前提下)

3:并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,我们的项目使用的时redis作为缓存(这类非关系型数据库还是挺好的)。增加服务器是第二步(一般政府项目的首先,因为不用对项目技术做大改动,求一个稳,但前提是资金充足),至于线程池的设置,设置参考 2 。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件(任务时间过长的可以考虑拆分逻辑放入队列等操作)对任务进行拆分和解耦。

免责声明:文章转载自《线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇矩阵求逆c++实现android 手机分辨率下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

优化springboot

介绍 在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢? 1. 方便微服务部署。 2. 方便项目启动,不需要下载Tomcat或者Jetty 针对目前的容器优化,目前来说没有太多地方,需要考虑如下几个点 线程数 超时时间 jvm优化 针对上述的优化点来说,首先线程数是一个重点,初...

SQL Server 数据库资源占用分析

1.1查看数据库当前用户连接数和最耗时的查询 USEmaster GO --看一下当前的数据库用户连接有多少--如果要指定数据库就把注释去掉 SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb' SELECT * FROM [sys].[dm_...

@EnableAsync@Async使用总结

我们在使用多线程的时候,往往需要创建Thread类,或者实现Runnable接口,如果要使用到线程池,我们还需要来创建Executors,在使用spring中,已经给我们做了很好的支持。只要要@EnableAsync就可以使用多线程。使用@Async就可以定义一个线程任务。通过spring给我们提供的ThreadPoolTaskExecutor就可以使用线...

Python多线程----线程池以及线程实现异步任务

Python多线程----线程池 需求:假设我们现在有一个多线程项目,每有一个用户连接进来,我们的服务器就会创建一个线程。而我们的服务器最多能够承载100个线程,再多就会崩溃。为了防止恶意用户伪装真实用户构建大量的访问来让我们的服务器崩溃,现在需要对线程数量进行限制,一共只有100个线程,并且当一个用户访问结束以后线程会自动归还,等待下一个用户访问。如果1...

线程池:Execution框架

每问题每线程:在于它没有对已创建线程的数量进行任何限制,除非对客户端能够抛出的请求速率进行限制。 下边 有些图片看不到,清看原地址:http://www.360doc.com/content/10/1027/21/495229_64583490.shtml 无限制创建线程的缺点: 1.线程生命周期的开销:线程的创建和关闭并不是“免费的”。 2.资源消耗量:...

Tomcat配置和优化(转)

---恢复内容开始--- 本文链接:https://blog.csdn.net/Ezra1991/article/details/88605169 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在...