A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 本人已死 中级黑马   /  2013-4-11 21:15  /  2353 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 本人已死 于 2013-4-13 19:44 编辑

上午看教材上面写着 cpu只有一个,增加线程时需要额外的开销。晚上回来看视频讲的下载时,很多线程一起下载起来比较快。。。java新手求救!!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

9 个回复

倒序浏览
就跟迅雷下载是一样的,你单个线程下载1GB的东西,分5个线程下载会更快些。多线程就是把1GB的东西分成5等份,然后5个线程开始下载,要知道Cpu不是同时运行5个线程的,CPU同一时刻只能运行一个线程,只不过它是在线程之间做着快速切换动作。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
照这样说,比如下载2G的东西,分5个线程,此时CPU也是在这5个线程之间做高速切换的,CPU始终还是在执行一个线程,但是切换也是要时间的啊,何必不一个线程一次性搞完呢,还省去了切换的时间。不知道能否这样想??
回复 使用道具 举报
一个线程获取执行权的几率大一些,还是5个线程获取执行权的几率大一些
回复 使用道具 举报
赵晓东 发表于 2013-4-11 22:49
一个线程获取执行权的几率大一些,还是5个线程获取执行权的几率大一些

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

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

一般来说,分给每个线程的时间片大约是0.1秒,而很多时候,线程根本要不到这么多时间,于是大量的时间被浪费了,有时候甚至比线程用来进行计算的时间还多,这就出现了多线程反而更慢甚至把系统拖垮的情况。而在多处理器系统中,由于windows可以将任务分给不同的cpu同时计算,浪费量就相对少了,我们感觉上程序运行速度就更快了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
黄玉昆 黑马帝 2013-4-13 08:17:44
8#
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
这个问题 拿迅雷举例子 就不合适了。迅雷是要考虑带宽问题的。你可以把任务看做一个对象,而多线程是创建出很多的执行者去完成这个对象。
还有就同步和异步的问题了
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
回复 使用道具 举报
HM王琦 发表于 2013-4-11 22:14
照这样说,比如下载2G的东西,分5个线程,此时CPU也是在这5个线程之间做高速切换的,CPU始终还是在执行一个 ...

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