zoukankan      html  css  js  c++  java
  • JAVA多线程,真的能提高效率吗

    举个栗子

    比如挖一个隧道,有2种开工方法
    1、只在山的一头挖,直至挖到山的另一头,从而打通隧道,这可以看成是单线程

    2、在山的两头挖,同时开工,最后在山的中间接通,从而打通隧道,这感觉肯定比1快了很多,好比多线程

    但是2成立的前提是必须有两个工人。而我们的计算机中一般来说只有一个CPU,也就是说只有一个工人。
    多线程不过是CPU在不同的时间片之间切换,而表现出齐头并进的样子。

    既然挖隧道的人只有一个,虽然我的施工方案是在山的两头开挖,但是由于工作的人只有一个,所以只有让这个人在山的两头跑,挖一会这头再去挖另一头,来回跑是要花费额外时间的(好比线程的切换和调度)。

    那么,我们是不是可以说,在单CPU的机器中,多线程反而降低了效率呢?

    1.

    不能一概而论,你的看多线程在你的程序中为啥而生。在单cpu系统,比如有io的等待,多线程的确能提高效率

    2.

    如果cpu确实是一个挖山工人,且它工作挖2个小时,然后必须休息1小时;这1小时休息期间如果让它跑到山那头继续挖,效率还是很高的。
    现在的程序时间大多花在读取数据上,真正的计算工作花时间还是相对少的,因此cpu很大时间表现都很闲,就像挖土效率高,运土效率低。多线程就是要充分利用它的挖土效率。

    3.

    pc机不光只一个cpu,cpu和其它硬件设备一起才能完成计算,分工协作,但可能出现其中某个家伙偷懒或效率低,导致大家都等它,闲着的其它设备这个时候可以腾出手来干其它活。单cpu在同一时刻只能干一件事情,这没有问题,问题是它并不是7*24*3600都在干活,其它设备也是同样的道理,多线程的目的可以最大限度的提高硬件设备的利用率。

    4.
    同一个设备可以同时(并行,互不影响)干几件事情,但同一个设备在同一时刻肯定只能干一件事情,一般我们说并行或串行,都以时间段来看的而不是以时间点来看的,比如你一边上je消遣还一边写代码干活,在一定的时间范围内,你是并行的,但如果这个时间范围你划分得非常非常短,那么你是串行的。

    5.
    一个cpu可以多线程。但是一个单核的cpu任何时间点,都只能在做一个任务。
    如果只是像楼主说的挖隧道这么简单的挖,那么的确多线程没用。
    只不过很可惜,计算机不像拿铁锹挖隧道这么简单。

    假设每挖5分钟,就需要清理一下挖出来的石土。有一个小车在清理它们。
    工人只有一个。
    单线程的做法是: 挖5分钟。然后工人停止挖,小车清理石土的5分钟里,工人在等待。
    2个线程的做发是: 挖5分钟,小车来清理石土。这5分钟里,工人在另一头挖。

    也不是很恰当的比喻。不过至少能说明点问题。
    小车清理石土,就相当于磁盘io等相对于cpu计算来说比较慢的操作。

    cpu不会等着io的完成,而去执行另一个进程的计算任务。
    这边io完成时好象是会发出什么信号来着,忘了。计算机原理都还给老师了,惭愧啊。

    如楼主所举的例子,我来解惑。
    如果一个机器人代表CUP,哪么这个机器人一天所做的事情,并不都是只挖山。
    它还有许多事情要做,比如砍柴,烧水,钓鱼,挖山等等等。
    如果按以上划分是 4条进程, 每一个进程大概占用1/4CUP时间。

    如果你的设定 在挖山这一快 多设几次同一个任务。 比如设定到 挖山共有3条线程。

    哪么 挖山的CUP占用率将达到 1/2 这就是所谓的提高了效率。

    现实中的CPU 在大部分时候的 闲置状态的。
    因此 开多条线程能提高效率 不如说成是 充分利用了CPU执行时间。

  • 相关阅读:
    SGU 176.Flow construction (有上下界的最大流)
    POJ 2391.Ombrophobic Bovines (最大流)
    poj 1087.A Plug for UNIX (最大流)
    poj 1273.PIG (最大流)
    POJ 2112.Optimal Milking (最大流)
    SGU 196.Matrix Multiplication
    SGU 195. New Year Bonus Grant
    关于multicycle path
    ppt做gif动图
    codeforces 598A Tricky Sum
  • 原文地址:https://www.cnblogs.com/shann/p/6851889.html
Copyright © 2011-2022 走看看