锁定老帖子 主题:JAVA多线程,真的提高了效率吗?
精华帖 (1) :: 良好帖 (0) :: 隐藏帖 (17)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-04
寒,楼主对多线程的理解完全不对
|
|
返回顶楼 | |
发表时间:2009-01-04
嗯。。。
线程这种东西你开它也是有开销的,所以还是要看业务场景和具体的情况。 |
|
返回顶楼 | |
发表时间: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完成时好象是会发出什么信号来着,忘了。计算机原理都还给老师了,惭愧啊。 多谢,让我对多线程问题又有了深一层的理解 |
|
返回顶楼 | |
发表时间:2009-01-04
最后修改:2009-01-04
我比较菜,我对多线程的理解就是,费时间的运算,丢到一个线程里面让它慢慢算,有时间就算,否则把我的主界面给弄的不响应了,搞得我火大。
|
|
返回顶楼 | |
发表时间:2009-01-04
比喻不太对,他们不是挖一个洞,一般都是挖多个洞.
|
|
返回顶楼 | |
发表时间:2009-01-04
楼上是指计算机系统结构的流水线技术,指令级并行么?
yyjn12也没说一个时间点执行一条指令,那么就不能多线程 |
|
返回顶楼 | |
发表时间:2009-01-04
计算机体系结构
推荐lz去补课 |
|
返回顶楼 | |
发表时间:2009-01-04
恩,感谢大家的回复。
这个问题我觉得可以这样理解不知道对不对: 对单CPU的机器来说,多线程并不是程序的并发执行,只是因为每个线程的执行时间很短,cpu在线程之间切换很快,在宏观上给人的感觉是并行执行的。 显然多线程可以提高CPU的利用率。但是我觉得仅仅是提高了利用率而已, 因为对程序本身来说无论是多线程还是单线程,程序执行完10个用户的请求所用的总时 间是一样多的(理论上说多线程应该总时间更长,因为线程切换也应该花时间的吧)。 但是对单个用户来说,获得的体验确是很不一样的,如果单线程的话,假设处理每个请求要用10秒,那么第十个请求就得等9*10秒,而且在处理每个请求的10秒中,CPU并不是一直处于计算中,有可能在进行IO操作等,那么多线程就可以在这里发挥作用,当某个请求处于IO阻塞等耗时的操作时另一个线程开始运行起来了,去处理其他请求,这就节约了时间,而且宏观上表现出来的是并行执行 |
|
返回顶楼 | |
发表时间:2009-01-04
建议LZ读操作系统的书.
我在写一个群点歌的时候,由于是单线程,后来改用线程池.效率提交了N倍. |
|
返回顶楼 | |
发表时间:2009-01-04
kebo 写道 不能一概而论,你的看多线程在你的程序中为啥而生。在单cpu系统,比如有io的等待,多线程也能提高效率
|
|
返回顶楼 | |