天天看点

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
           

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