使用线程池做并发编程中,遇到个问题就是:线程池大小该设置多少。线程池并非越大越好,设置大了,在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
当然这里任务数不多,任务数多的话还需根据情况测试调整线程池大小了。