多线程为什么可以提高效率

来源:互联网 发布:淘宝店铺号申请 编辑:程序博客网 时间:2024/04/28 20:45

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 这就是所谓的提高了效率。
(为什么会达到1/2,我个人觉得是因为线程是处理器调度和分派的基本单位。)

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

以下是学到的一些相关知识,个人总结:
多线程就好比在等待水开的同时看报纸,而不是等水开了之后再开始看报纸。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率
做水看报纸就好比 有一个操作耗时 但是又不想让这个耗时操作影响用户体验 这种场景的多线程并不是想提升效率。Android开发很多这种场景 从网络上拿数据的时候 不想让界面停滞,所以一般都开个线程去做,这种需求并不是为了提升效率, 加上调度时间 如果是单核CPU 效率肯定是下降的.。而且 效率不能单从CPU满载的角度考虑 还得考虑业务,这种方式是不是提升了 你业务的效率,你这个多线程模块在系统当中扮演的角色。效率不能执着于 执行程序的效率。对于多核CPU 提升效率是肯定的。内核级别的多线程,每个线程分配在不同的核上跑 肯定会提升效率。系统的多线程就是这两种方式的混合,内核态多线程和用户态多线程。并发不一定都是为了提高程序本身的执行效率 大部分都是为了满足业务效率,Android是为了不卡主线程 保证界面随时都是有响应的,http异步请求是为了避开网络服务器性能瓶颈。并发也不是只有线程这一种方案,多进程 异步I/O,都是为了业务服务。大部分的多线程场景 都会共享数据 锁的效率很低,调度也是浪费效率的,线程之间是共享内存的额。

转载自
http://www.cnblogs.com/shann/p/6851889.html#undefined

原创粉丝点击