黑马程序员技术交流社区

标题: 多线程加速程序运行是个什么情况 [打印本页]

作者: 本人已死    时间: 2013-4-11 21:15
标题: 多线程加速程序运行是个什么情况
本帖最后由 本人已死 于 2013-4-13 19:44 编辑

上午看教材上面写着 cpu只有一个,增加线程时需要额外的开销。晚上回来看视频讲的下载时,很多线程一起下载起来比较快。。。java新手求救!!
作者: 赵晓东    时间: 2013-4-11 21:30
就跟迅雷下载是一样的,你单个线程下载1GB的东西,分5个线程下载会更快些。多线程就是把1GB的东西分成5等份,然后5个线程开始下载,要知道Cpu不是同时运行5个线程的,CPU同一时刻只能运行一个线程,只不过它是在线程之间做着快速切换动作。
作者: HM王琦    时间: 2013-4-11 22:14
照这样说,比如下载2G的东西,分5个线程,此时CPU也是在这5个线程之间做高速切换的,CPU始终还是在执行一个线程,但是切换也是要时间的啊,何必不一个线程一次性搞完呢,还省去了切换的时间。不知道能否这样想??
作者: 赵晓东    时间: 2013-4-11 22:49
一个线程获取执行权的几率大一些,还是5个线程获取执行权的几率大一些
作者: 本人已死    时间: 2013-4-12 01:51
赵晓东 发表于 2013-4-11 22:49
一个线程获取执行权的几率大一些,还是5个线程获取执行权的几率大一些

在电脑上拽东西是一个一个拽快些 还是多个多个拽快些呢。:'(脑袋全乱了
作者: 郭强    时间: 2013-4-13 00:47
迅雷只所以要分成多线程下载,是因为每个线程都能享受到服务器的一份带宽,多个线程自然得到了服务器更多的带宽,自然下载速度就快了。
请参考张孝祥老师的高新技术多线程视频第一节末尾有讲到。
作者: 余丽丽    时间: 2013-4-13 00:53
从理论上讲,如果当前存在n个线程,那么每个线程使用的cpu时间片为1/n,如果又开了一个线程,那么每个线程使用的cpu时间片为1/(n+1),当前进程所能使用的cpu时间片为2/(n+1)>1/n。

乍一看去,还真能提高速度,但别忘了,这仅仅是理论而已,实际情况要复杂的多。windows把cpu时间片分给每个线程后,这段时间内,cpu完全归这个线程和windows占有,线程就可以在这段时间内进行一些计算。如果计算完毕,还剩有一些时间,而线程又没有结束,那么windows将会一直等待下去,直到把下一个时间片分给另一个线程。

一般来说,分给每个线程的时间片大约是0.1秒,而很多时候,线程根本要不到这么多时间,于是大量的时间被浪费了,有时候甚至比线程用来进行计算的时间还多,这就出现了多线程反而更慢甚至把系统拖垮的情况。而在多处理器系统中,由于windows可以将任务分给不同的cpu同时计算,浪费量就相对少了,我们感觉上程序运行速度就更快了
作者: 黄玉昆    时间: 2013-4-13 08:17
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: zhuiyi0819    时间: 2013-4-13 09:36
这个问题 拿迅雷举例子 就不合适了。迅雷是要考虑带宽问题的。你可以把任务看做一个对象,而多线程是创建出很多的执行者去完成这个对象。
还有就同步和异步的问题了
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
作者: lipingan0520    时间: 2013-4-13 09:55
HM王琦 发表于 2013-4-11 22:14
照这样说,比如下载2G的东西,分5个线程,此时CPU也是在这5个线程之间做高速切换的,CPU始终还是在执行一个 ...

当初我也是和你这样想的。但是学完多线程,我的看法就有点不同了。你知道一个程序最少有一个主线程,比如:当主线程运行到迅雷下载的时候,如果只是一个线程,那主线程就停下来了,就运行迅雷下载这个线程了,等完了释放了,主线程才往下执行。如果多线程就不同啦,迅雷可以继续下载,主线程可以继续往下走。
多线程就好比,你边下载,边看电影,各不打扰。
而单线程,就在这个时间内,只能执行一个任务,其它的不行。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2