论坛首页 招聘求职论坛

JAVA多线程,真的提高了效率吗?

浏览 38572 次
精华帖 (1) :: 良好帖 (0) :: 隐藏帖 (17)
作者 正文
   发表时间:2009-01-04  
寒,楼主对多线程的理解完全不对
0 请登录后投票
   发表时间:2009-01-04  
嗯。。。
线程这种东西你开它也是有开销的,所以还是要看业务场景和具体的情况。
0 请登录后投票
   发表时间:2009-01-04   最后修改:2009-01-04
yyjn12 写道
taupo 写道
在面试的时候被问了一个多线程的问题
回来仔细思考了一下,多线程是否真的能提高了效率?
我对多线程的理解就是:
比如挖一个隧道,有2种开工方法
1、只在山的一头挖,直至挖到山的另一头,从而打通隧道,这可以看成是单线程

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

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

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

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



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

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

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



多谢,让我对多线程问题又有了深一层的理解
0 请登录后投票
   发表时间:2009-01-04   最后修改:2009-01-04
我比较菜,我对多线程的理解就是,费时间的运算,丢到一个线程里面让它慢慢算,有时间就算,否则把我的主界面给弄的不响应了,搞得我火大。
0 请登录后投票
   发表时间:2009-01-04  
比喻不太对,他们不是挖一个洞,一般都是挖多个洞.
0 请登录后投票
   发表时间:2009-01-04  
楼上是指计算机系统结构的流水线技术,指令级并行么?
yyjn12也没说一个时间点执行一条指令,那么就不能多线程
0 请登录后投票
   发表时间:2009-01-04  
计算机体系结构


推荐lz去补课
0 请登录后投票
   发表时间:2009-01-04  
恩,感谢大家的回复。

这个问题我觉得可以这样理解不知道对不对:

对单CPU的机器来说,多线程并不是程序的并发执行,只是因为每个线程的执行时间很短,cpu在线程之间切换很快,在宏观上给人的感觉是并行执行的。

显然多线程可以提高CPU的利用率。但是我觉得仅仅是提高了利用率而已,

因为对程序本身来说无论是多线程还是单线程,程序执行完10个用户的请求所用的总时

间是一样多的(理论上说多线程应该总时间更长,因为线程切换也应该花时间的吧)。

但是对单个用户来说,获得的体验确是很不一样的,如果单线程的话,假设处理每个请求要用10秒,那么第十个请求就得等9*10秒,而且在处理每个请求的10秒中,CPU并不是一直处于计算中,有可能在进行IO操作等,那么多线程就可以在这里发挥作用,当某个请求处于IO阻塞等耗时的操作时另一个线程开始运行起来了,去处理其他请求,这就节约了时间,而且宏观上表现出来的是并行执行
0 请登录后投票
   发表时间:2009-01-04  
建议LZ读操作系统的书.

    我在写一个群点歌的时候,由于是单线程,后来改用线程池.效率提交了N倍.
0 请登录后投票
   发表时间:2009-01-04  
kebo 写道
不能一概而论,你的看多线程在你的程序中为啥而生。在单cpu系统,比如有io的等待,多线程也能提高效率

0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics