在设置线程池线程个数的时候,经常会想到这个问题,是不是设置的线程数越多越好?理解这个问题之前我们要先清楚的知道我们为什么使用多线程。
为什么会使用多线程
使用多线程的主要目的我们应该都能回答的出来就是提高程序的性能,这个提高性能其实是指 降低延迟 (发送请求到接收到数据的时间)和 提高吞吐量 (单位时间能可以处理更多的请求)。
降低延迟和提高吞吐量对应的方法有两种: 优化算法 和 将机器的硬件性能发挥到极致
优化算法:降低时间和空间复杂度,使得程序执行时间更短。
将硬件的性能发挥到极致,具体的指提高I/O 和cpu的利用率
如何提高I/O 和cpu的利用率的举例:
如果单核系统中 只有一个程序执行又有IO操作 和Cpu计算的代码,当程序执行IO操作的时候,Cpu其实是空闲的,反之IO是空闲的,如果这个时候用两个线程去跑这段代码,一个线程执行IO操作 ,一个线程执行Cpu计算 ,这时IO和Cpu的利用率是不是发挥了极致?
创建多少线程比较合适
经过上面的分析,我们知道创建多少线程能够将硬件的利用率达到最高才是最好的线程数。我们从线程的应用场景来分析,由于IO操作比Cpu计算耗时要久的多的,如果我们一段程序有IO操作 和 Cpu计算 我们可以称之为:IO密集型计算。程序中没有IO操作 只有Cpu的话称之为Cpu密集型程序。IO密集计算:如何将硬件利用率达到极致呢 我们将 R = IO耗时 / Cpu耗时 我们从上面的例子来看 如果IO耗时/Cpu耗时 = 10 (我们平常可以用工具apm来统计这个比例) 创建线程A 执行io操作我们希望IO操作的时候 Cpu不能闲着 所以就应该创建10个线程去执行Cpu计算 当Io操作完毕后刚好Cpu也执行完毕 ,他们的利用率都是百分之100 在执行这段代码的时候。这个例子我们要创建 1+ 10 = 11个线程执行起来效率更高,于是我们就得到了公式: 1+ I/O耗时/Cpu耗时,如果是多核Cpu 最佳线程数 =CPU 核数 * [ 1 +(I/O耗时 / Cpu 耗时)Cpu密集型:这个就很简单了 Cpu的核数 = 线程数就行,一般我们会设置 Cpu核数+1 防止由于其他因素导致线程阻塞等。
小编分类整理了许多java进阶学习材料和BAT面试题,需要资料的请加QQ群:731611386 就能领取2019年java进阶学习资料和BAT面试题以及《Effective
Java》(第3版)电子版书籍。
网友评论