Answer
1.为什么要使用线程池
线程是稀缺资源,使用线程池可以减少线程创建和销毁的次数,达到线程复用的目的;
可以根据系统的承受能力,调节工作线程的个数,防止消耗过多内存导致服务器崩溃。
2.线程池设置多大?
充分利用系统资源,增强服务器的吞吐量,同时尽可能减少不必要的线程切换。
- 如果是CPU密集型应用,则线程池大小设置为N+1
- 如果是IO密集型应用,则线程池大小设置为2N+1
最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目
3.如何充分利用系统资源
根据短板效应,真实的系统吞吐量并不能单纯根据CPU来计算。那要提高系统吞吐量,就需要从“系统短板”(比如网络延迟、IO)着手:
- 尽量提高短板操作的并行化比率,比如多线程下载技术
- 增强短板能力,比如用NIO替代IO
4.是不是多线程就一定高效呢
答案是否定的,比如Redis就是单线程的,但它却非常高效,基本操作都能达到十万量级/s。当然“Redis很快”更本质的原因在于:Redis基本都是内存操作,这种情况下单线程可以很高效地利用CPU。而多线程适用场景一般是:存在相当比例的IO和网络操作。
Dark Magic 估算方法