本文从控制变量的角度来谈决定线程个数的依据。模型很简单,在实际的生产环境中,情况肯定比下文要复杂的多。要充分的进行测试,以使线程个数为优。
java应用程序大概分为两种:cpu密集型和io密集型。
cpu密集型:
就是指线程大部分时间都在用cpu,一般来说,普通的操作都需要用到cpu,比如计算,读取,循环,赋值,查询,排序等等。在最理想的情况下,大牛们建议将线程数设置为count(cpu)+-1
io密集型
io操作一般不需要cpu的参与,线程在io时,线程会被阻塞(线程的六个状态之一就有Blocked)如果一个线程完成某项工作一共需要100ms,其中io需要80ms,cpu需要20ms(忽略其他时间).那么线程数应该设立为5.
有锁的情况
多线程为了安全,往往会加锁。对于关键代码(被频繁调用的代码),往往可以成为线程个数的依据之一。对于全局锁(比如static上锁),无论多少个线程,代码都是串行执行的。这样线程越多反而越不好。对于锁粒度的越小,对于线程并发来说越有利。比如ConcurrentHashMap来说,分了16个segment,也就是加了16把锁。在理性的情况下,锁粒度可以降低16倍,那么自然可以允许16个并发。最坏的情况是16个线程去争用一个segment。这个线程的个数需要根据实际情况去调优。