• 过小会导致程序不能充分地利用系统资源、容易导致饥饿
  • 过大会导致更多的线程上下文切换,占用更多内存

    CPU 密集型运算

    通常采用 cpu 核数 + 1 能够实现最优的 CPU 利用率,+1 是保证当线程由于页缺失故障(操作系统)或其它原因导致暂停时,额外的这个线程就能顶上去,保证 CPU 时钟周期不被浪费

    I/O 密集型运算

    CPU 不总是处于繁忙状态,例如,当你执行业务计算时,这时候会使用 CPU 资源,但当你执行 I/O 操作时、远程 RPC 调用时,包括进行数据库操作时,这时候 CPU 就闲下来了,你可以利用多线程提高它的利用率。
    经验公式如下
    线程数 = 核数 期望 CPU 利用率 总时间(CPU计算时间+等待时间) / CPU 计算时间
    例如 4 核 CPU 计算时间是 50% ,其它等待时间是 50%,期望 cpu 被 100% 利用,套用公式

    4 * 100% * 100% / 50% = 8

    例如 4 核 CPU 计算时间是 10% ,其它等待时间是 90%,期望 cpu 被 100% 利用,套用公式

    1. 4 * 100% * 100% / 10% = 40
    1. private int parallism;
    2. private ExecutorService pool;
    3. public ExecutorServiceCalculator() {
    4. parallism = Runtime.getRuntime().availableProcessors(); // CPU的核心数 默认就用cpu核心数了
    5. pool = Executors.newFixedThreadPool(parallism);
    6. }