java项目中线程池的线程数是怎么确定的

本文探讨了如何合理配置Java线程池,考虑了任务特性、CPU使用率、任务优先级、执行时间和依赖性等因素。CPU密集型任务推荐设置为N*cpu核数,IO密集型任务建议设置为2*cpu核数。线程池大小还应考虑任务执行时间、依赖关系和系统资源。使用有界队列可增加系统稳定性和预警能力。优先级队列适用于不同优先级任务的处理。合理配置线程池能提高系统性能和资源利用率。
摘要由CSDN通过智能技术生成

《Java8 实战》P233

解释一下:

线程池大小的设置要考虑的因素很多,单纯只考虑任务特性是cpu密集型还是io密集型的情况下:

cpu密集型,计算比较多通常设置N*cpu核数,

IO密集型,数据库操作比较较多,设置2*cpu核数。对于混合型的,

《Java8 实战》P233 有这样一个公式,图2公式变形之后可知,在cpu核数只有1个且要求cpu使用率100%,Nth = 1,也就是说设置线程数为1;同理,cpu核数为1,w:c = 1 :1,cpu使用率要达到100%,Nth = 2,即cpu核数设置为2。在这种情况下可以用红色箭头方向解释,单位时间内,前半段第一个线程进行cpu使用,后半段io的时候,第二个线程使用cpu达到cpu使用率100%。但注意,在实际中线程池线程数设置要考虑的因素很多往往并没有按照如上公式严格执行。

如何合理配置线程池(多种情况考虑):

1.分析任务特性

根据任务特性任务的性质:CPU密集型任务,IO密集型任务和混合型任务。

任务的优先级:高,中和低。

任务的执行时间:长,中和短。

任务的依赖性:是否依赖其他系统资源,如数据库连接。

2.任务性质不同的任务可以用不同规模的线程池分开处理。CPU密集型任务配置尽可能小的线程,如配置Ncpu+1个线程的线程池。IO密集型任务则由于线程并不是一直在执行任务,则配置尽可能多的线程,如2*Ncpu。混合型的任务,如果可以拆分,则将其拆分成一个CPU密集型任务和一个IO密集型任务,只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐率要高于串行执行的吞吐率,如果这两个任务执行时间相差太大,则没必要进行分解。我们可以通过Runtime.getRuntime().availableProcessors()方法获得当前设备的CPU个数。

3.优先级不同的任务可以使用优先级队列PriorityBlockingQueue来处理。它可以让优先级高的任务先得到执行,需要注意的是如果一直有优先级高的任务提交到队列里,那么优先级低的任务可能永远不能执行。

4.执行时间不同的任务可以交给不同规模的线程池来处理,或者也可以使用优先级队列,让执行时间短的任务先执行。

5.依赖数据库连接池的任务,因为线程提交SQL后需要等待数据库返回结果,如果等待的时间越长CPU空闲时间就越长,那么线程数应该设置越大,这样才能更好的利用CPU。

6.建议使用有界队列,有界队列能增加系统的稳定性和预警能力,可以根据需要设大一点,比如几千。



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值