java线程池的maxSize应该设多大?

今天听高人透露了一个公式:

引用
maxSize =  逻辑cpu数/(1 – I/O等待时间占比)

也就是说,

1. 如果你的任务是纯CPU操作,则maxSize = cpu数,一个CPU服务一个线程。如果线程数<cpu数,则cpu的并行能力未得到充分利用;如果线程数>cpu数,吞吐率也不会变高,反而会因为过多context switch而损害性能。

2. 如果你的任务I/O等待占了一半时间,则maxSize = cpu * 2; 这时,用于cpu操作的线程数是maxSize的一半,恰好=cpu数。如果你的cpu是双核,则maxSize=4, 当4个中的2个线程因为I/O而阻塞时,另外两个非I/O线程可以被调度进来,刚好占满CPU的坑位。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.