如何配置线程池

参考:并发编程从入门到精通一书

参考:这篇也有意思https://www.cnblogs.com/dennyzhangdd/p/6909771.html?utm_source=itdadao&utm_medium=referral

没有绝对的配置,根据业务、机器、程序看情况配置

一.业务情况

1.任务的性质:cpu‘密集型(程序计算)和io密集型(网络io磁盘io、db)

2.任务的并发数量:大并发、中等并发、很少有人访问

3.任务的执行时间:长、中、短

4.任务的优先级:高、中、低

5.任务的依赖性:是否依赖其他资源,如数据库连接,业务流程之间是否依赖

6.按资源性质:动态资源、静态资源

7.业务之间的耦合性:耦合高、可解耦、没有耦合

二.配置原则

1.任务性质不同的任务可以用不同规模的线程池分开处理,程序密集型任务尽量配置少的线程数量,入Ncpu+1的线程,Ncpu是cpu核心数。IO密集型,由于一条线程会堵塞不是一直在执行任务,所以尽量配置多的线程,提高cpu利用率,如2*Ncpu。

混合任务,如果可以拆分,拆分成一个程序密集型任务和一个io密集型任务,只要两任务的执行时间不是相差太大,拆分后的吞吐率更高,用各自的线程池去做;如果两者执行时间差很多,就没必要拆分了,用一个线程池就行。

以上只是javase,不是对web开发说的,如果是tomact,请求进来直接就是tomcat线程池中的线程在执行你的业务程序,执行程序计算,你当然不用再给此计算切换到别的线程,否则反而浪费资源了。

在程序中可以通过Runtime.getRuntime().availableProcessors() 得到当前机器cpu核数

2.优先级不同的任务可以放到优先级队列PriorityBlockingQueue中处理,优先级高的会先执行,但有可能优先级低的永远得不到执行

3.执行时间不同的任务可以通过不同规模的线程池执行,或者使用优先级队列,使时间短的任务先执行

4.依赖数据库连接的任务,因为线程提交sql后需要等待数据库返回执行结果(数据库io,数据网络传输),如果时间越长,cpu空闲时间越长,此线程堵塞时间越长,那么就应该设置更多的线程,充分利用cpu

5.使用有界队列,如果无界队列,可能会占满内存。

把项目划分成多服务后,比如一台机器部署了一个文件上传下载服务,和一个程序计算密集的服务,(或者一个项目中有这两种业务)他们用各自不同规模的线程池就ok。

那程序计算中难免设计到数据库io,就一定要提交到子线程执行吗?我觉得不一定,得看此sql的速度,如果执行的很快,也许耗费的资源比上下文切换还少,又何必进行上下文切换。如果是网络io呢,也得看具体接口速度网络环境等等,但经验上说网络io一般是稍慢

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值