最近在学习多线程,很多网上资料说多线程是为了设计,并不是为了提高效率而生。主要用在出现IO等阻塞时才能提高效率,其他情况下不能提高。这是真的吗?多个CPU下呢? 如果我有一大批文件要解析(已经传过来没有IO阻塞),起个线程池用多个线程去解析真的和一个一个解析快不了多少吗?
 在双核下呢?小弟原来测试过双核下多个线程去上传大文件,结果速度并没有比单个线程快多少,是不是因为IO的速度大大限制了?谢谢

解决方案 »

  1.   

    这个问题有点复杂,似乎不是简单几句话就能说清楚的。决定效率主要概括为两个大因素:IO(网络或磁盘)、CPU。对于IO而言,举个极端的例子,你用个64KB的小猫从网上下载某个软件0,如果浏览器不是多线程模型的话,那么就一直在那里耗着,啥事也干不了。(当然如果要较真的话,就算不是多线程模型,也有办法不被完全阻塞的)
    接下来看看你的问题:
    ◎ 如果我有一大批文件要解析(已经传过来没有IO阻塞),起个线程池用多个线程去解析真的和一个一个解析快不了多少吗?
    —— 是的,如果你假定完全没有IO阻塞,确实多线程不会比单线程快,甚至还可能更慢,因为线程切换是有开销的。
    ◎在双核下呢?
    —— 那就大大的不一样,单个线程只能运行在一个核上,这种情况下另外一个核是完全没有发挥作用的,是被浪费的;超线程技术(HT)的情况也类似双核,但没有双核那么彻底。
    ◎小弟原来测试过双核下多个线程去上传大文件,结果速度并没有比单个线程快多少,是不是因为IO的速度大大限制了?
    —— 除了IO速度外,你的多线程模型也很可能是个问题;我见过不少人写出来的多线程代码,实际上都因为某个竞争资源的关系,其实是在不断的轮流着排队执行,表面上看起来似乎是都在并发的做事情,其实比一个线程还差劲。
    —— 建议你尝试去写一个哪怕只是简单的:从 1加到10000,总共做1000次;然后你用两个线程各做500次和一个线程做1000次,比较下看看总时间如何就知道了。
    —— 当然,由于你是双核CPU,所以4个线程跟2个线程效果是差不多的,原因为啥相信你自己能分析。
      

  2.   

    多核及线程效率问题,取决于JVM的具体实现。
      

  3.   

    自己顶下,一般CPU几个核就起几个线程吧
      

  4.   


    楼主忘了有个技术叫做“超线程”么?也就是一个核可以模拟处理2条指令流水线,充分挖掘CPU的处理空闲时间。
      

  5.   

    线程开多了有overhead问题。这个具体情况具体分析。有些简单问题单线程是一定快的,
    没有overhead。有些情况开多线程并不是为了效率,而是为了用户体验。不能就一个线程快而其他巨慢。
      

  6.   

    就比如Node.js和Apache的多线程,不一定说哪个有绝对优势。