锁定老帖子 主题:JAVA多线程,真的提高了效率吗?
精华帖 (1) :: 良好帖 (0) :: 隐藏帖 (17)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-04
回来仔细思考了一下,多线程是否真的能提高了效率? 我对多线程的理解就是: 比如挖一个隧道,有2种开工方法 1、只在山的一头挖,直至挖到山的另一头,从而打通隧道,这可以看成是单线程 2、在山的两头挖,同时开工,最后在山的中间接通,从而打通隧道,这感觉肯定比1快了很多,好比多线程 但是2成立的前提是必须有两个工人。而我们的计算机中一般来说只有一个CPU,也就是说只有一个工人。 多线程不过是CPU在不同的时间片之间切换,而表现出齐头并进的样子。 既然挖隧道的人只有一个,虽然我的施工方案是在山的两头开挖,但是由于工作的人只有一个,所以只有让这个人在山的两头跑,挖一会这头再去挖另一头,来回跑是要花费额外时间的(好比线程的切换和调度)。 那么,我们是不是可以说,在单CPU的机器中,多线程反而降低了效率呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-04
不能一概而论,你的看多线程在你的程序中为啥而生。在单cpu系统,比如有io的等待,多线程也能提高效率
|
|
返回顶楼 | |
发表时间:2009-01-04
现在的服务器,好像已经没有单CPU了,连个人用机都双CPU了
|
|
返回顶楼 | |
发表时间:2009-01-04
与你串行的计算所消耗的时间占总共需要消耗时间的比重有关
也和你的可同时并发运行的core有多少有关。 |
|
返回顶楼 | |
发表时间:2009-01-04
楼主提的问题很有意思。经典的解释是 - 如果cpu确实是一个挖山工人,那么它工作就好像是挖1个小时,然后休息10个小时;这期间如果让它跑到山那头继续挖,效率还是很高的。
现在问题是 - 它是否工作1小时然后休息10小时?答案是肯定的。现在的程序时间大多花在读取数据上,真正的计算工作花时间还是相对少的,因此cpu很大时间表现都很闲,就像挖山,挖土效率高,运土效率低。多线程就是要充分利用它的挖土效率 |
|
返回顶楼 | |
发表时间:2009-01-04
pc机不光只一个cpu,cpu和其它硬件设备一起才能完成计算,分工协作,但可能出现其中某个家伙偷懒或效率低,导致大家都等它,闲着的其它设备这个时候可以腾出手来干其它活。单cpu在同一时刻只能干一件事情,这没有问题,问题是它并不是7*24*3600都在干活,其它设备也是同样的道理,多线程的目的可以最大限度的提高硬件设备的利用率。
|
|
返回顶楼 | |
发表时间:2009-01-04
同一个设备可以同时干几件事情,但一个设备在同一时刻肯定只能干一件事情,一般我们说并行或串行,都在以时间段来看的而不是以时刻来看的,比如你一边上je消遣还一边写代码干活,在一定的时间范围内,你是并行的,但如果这个时间范围你划分得非常非常短,那么你是串行的
|
|
返回顶楼 | |
发表时间:2009-01-04
随波踏浪 写道 yefeng 写道 现在的服务器,好像已经没有单CPU了,连个人用机都双CPU了
哈哈哈,多线程和多cpu有啥关系?一个cpu就不能多线程了?不懂请保存沉默,拜托 一个cpu可以多线程。但是一个单核的cpu任何时间点,都只能在做一个任务。 如果只是像楼主说的挖隧道这么简单的事,那么的确多线程没用。 只不过很可惜,计算机不像拿铁锹挖隧道这么简单。 |
|
返回顶楼 | |
发表时间:2009-01-04
taupo 写道 在面试的时候被问了一个多线程的问题
回来仔细思考了一下,多线程是否真的能提高了效率? 我对多线程的理解就是: 比如挖一个隧道,有2种开工方法 1、只在山的一头挖,直至挖到山的另一头,从而打通隧道,这可以看成是单线程 2、在山的两头挖,同时开工,最后在山的中间接通,从而打通隧道,这感觉肯定比1快了很多,好比多线程 但是2成立的前提是必须有两个工人。而我们的计算机中一般来说只有一个CPU,也就是说只有一个工人。 多线程不过是CPU在不同的时间片之间切换,而表现出齐头并进的样子。 既然挖隧道的人只有一个,虽然我的施工方案是在山的两头开挖,但是由于工作的人只有一个,所以只有让这个人在山的两头跑,挖一会这头再去挖另一头,来回跑是要花费额外时间的(好比线程的切换和调度)。 那么,我们是不是可以说,在单CPU的机器中,多线程反而降低了效率呢? 假设每挖5分钟,就需要清理一下挖出来的石土。有一个小车在清理它们。 工人只有一个。 单线程的做法是: 挖5分钟。然后工人停止挖,小车清理石土的5分钟里,工人在等待。 2个线程的做发是: 挖5分钟,小车来清理石土。这5分钟里,工人在另一头挖。 也不是很恰当的比喻。不过至少能说明点问题。 小车清理石土,就相当于磁盘io等相对于cpu计算来说比较慢的操作。 cpu不会等着io的完成,而去执行另一个进程的计算任务。 这边io完成时好象是会发出什么信号来着,忘了。计算机原理都还给老师了,惭愧啊。 |
|
返回顶楼 | |
发表时间:2009-01-04
最后修改:2009-01-04
随波踏浪 写道 yyjn12 写道 随波踏浪 写道 yefeng 写道 现在的服务器,好像已经没有单CPU了,连个人用机都双CPU了
哈哈哈,多线程和多cpu有啥关系?一个cpu就不能多线程了?不懂请保存沉默,拜托 一个cpu可以多线程。但是一个单核的cpu任何时间点,都只能在做一个任务。 如果只是像楼主说的挖隧道这么简单的事,那么的确多线程没用。 只不过很可惜,计算机不像拿铁锹挖隧道这么简单。 有种东西叫做i/o等待,还有中说法叫做微观的串行,宏观的并行 这里说的“任务”不是术语“任务”,只是口语。 单个单核心cpu任何一个时间点,应该是只能在执行一个指令吧? 多线程的目的只是提高cpu的利用率,像前边这位同学说的很好: tczengjin 写道 pc机不光只一个cpu,cpu和其它硬件设备一起才能完成计算,分工协作,但可能出现其中某个家伙偷懒或效率低,导致大家都等它,闲着的其它设备这个时候可以腾出手来干其它活。单cpu在同一时刻只能干一件事情,这没有问题,问题是它并不是7*24*3600都在干活,其它设备也是同样的道理,多线程的目的可以最大限度的提高硬件设备的利用率。
另外我觉得,“yefeng”同学绝对不像你想的那样不懂: 随波踏浪 写道 yefeng 写道 现在的服务器,好像已经没有单CPU了,连个人用机都双CPU了
哈哈哈,多线程和多cpu有啥关系?一个cpu就不能多线程了?不懂请保存沉默,拜托 |
|
返回顶楼 | |