newFixedThreadPool线程池数量问题

使用线程池做并发编程中,遇到个问题就是:线程池大小该设置多少。线程池并非越大越好,设置大了,在cpu资源有限的情况下,部分线程获取资源的时间会大幅度增加,从而完成时间也会增加的。

开始使用newFixedThreadPool建立线程池进行并发网络请求时,我设置线程数为5(电脑为双核),执行的时候发现结果出的很慢,通过Wireshark抓包,发现最早进入线程池的两个任务,真正执行却很晚,而其余线程中任务都跑了好几次了。

我这是网络请求,总共执行了20个任务,就通过src port进行对线程进行标记统计了下:

53147   53148   53145   53144   53146
  1       6       7       5       1

可以看出53147与53146只执行了一次任务,所以这两个端口对应的线程就是一直获取不到资源,开始执行时间很晚的那部分;

在网上查了其他资料,有文章指出:
如果是CPU密集型应用,则线程池大小设置为N+1
如果是IO密集型应用,则线程池大小设置为2N+1

上面已经是2N+1了,于是改为N+1,设置线程池大小为3,开始执行到出结果平均是原本时间的一半,从执行分布看也是很均匀:

53301   53500   53502
  7       6       7

当然这里任务数不多,任务数多的话还需根据情况测试调整线程池大小了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值