黑马程序员技术交流社区

标题: 多线程的问题 [打印本页]

作者: 不喝茶的陆羽    时间: 2013-5-8 13:47
标题: 多线程的问题
本帖最后由 不喝茶的陆羽 于 2013-5-8 15:09 编辑

单核cpu多线程 真的会提高运行效率吗?(除了与某些单线程堵塞情况相对比以外),多核多线程能够提速我能理解,但是单核不是应该只能提高资源的使用效率吗?
就像是写作业,速度不变,但是一直写和分成五分,换着写最后的结果不是一样吗?
老师说迅雷的分段下载能提高下载速度,按理说不是应该只适用于多核吗?(当然站在有可能单线程在某处堵住的角度我是理解的)
求解惑~
ps:我知道cpu切换执行的事...
以字母为例:ABCD四个线程,按顺序A执行完,执行B,执行完B,执行C,在之后执行D;和A-B-C-D-A-D-B-C-A...这样执行完,为什么说后一种高效?(除了拥堵问题以外)
作者: 刘茂林    时间: 2013-5-8 13:57
汗 单核 和多核的区别  多核的真正强大之处在于多任务的支持性好,两个核心可以分管任务,空闲时可以关闭一个核心并降频省电。具体要看运行什么程序来看差别,总的来说双核的比单核的运行要快些、流畅些。

同时开多个程序 多核的就会运行的顺利些。
作者: Oyxiaoxi    时间: 2013-5-8 13:58
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。
好处:·使用线程可以把占据时间长的程序中的任务放到后台去处理
·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
·程序的运行速度可能加快
·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等
不好的地方:如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
·更多的线程需要更多的内存空间。
·线程可能会给程序带来更多“bug”,因此要小心使用。
·线程的中止需要考虑其对程序运行的影响。
·通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。

作者: 黑马-雷钊    时间: 2013-5-8 14:28
你好,cpu其实在处理进程和线程的时候都是单个单个的执行。除非是多核心的cpu才能一次性执行多个线程。比如说你挂个Qq,开个网页。再放个音乐。看似cpu好像是一同执行的。其实不是。cpu一直在做着快速切换的动作。至于你说的迅雷的下载的问题你可以把它理解成做菜。10盘菜。你一盘盘的做肯定慢。因为你在做菜的时候会有时间是闲置着的。你把闲着的时间利用起来。同时炒两个菜。然后动作放快点。时间就自然减半了。同事速度也增加了。
作者: 不喝茶的陆羽    时间: 2013-5-8 14:55
黑马-雷钊 发表于 2013-5-8 14:28
你好,cpu其实在处理进程和线程的时候都是单个单个的执行。除非是多核心的cpu才能一次性执行多个线程。比如 ...

你指的闲置部分电脑在干嘛?
作者: 不喝茶的陆羽    时间: 2013-5-8 14:58
刘茂林 发表于 2013-5-8 13:57
汗 单核 和多核的区别  多核的真正强大之处在于多任务的支持性好,两个核心可以分管任务,空闲时可以关闭一 ...

希望大家能看完问题再回复
作者: 黑马-雷钊    时间: 2013-5-8 15:00
比如说你开个QQ,然后什么都不干。QQ只有在你在操作它的时候它CPu才会运作,你不操作它的时候它就是闲置的。这个闲置的时间假如你在下载的话cpu就会快速切换到下载那去。当然了。速度是极快的。等你再操作的QQ的时候cpu又快速切换到QQ上来。那时下载就暂停了。你操作完CPU又再次切换到下载。假如你就光开一个QQ你操作完CPU就在闲置了。不过这只是举个例子。cpu真正运行的时候是有几十条线程一起运行的
作者: 黑马-雷钊    时间: 2013-5-8 15:01
意思就是你不动它它就干完活就歇着。你可以多开几个程序让它干完这个干那个。。这样就把cpu闲着的时间利用起来了。速度也就比这个全部干完再干下个的速度快了
作者: 不喝茶的陆羽    时间: 2013-5-8 15:07
黑马-雷钊 发表于 2013-5-8 15:00
比如说你开个QQ,然后什么都不干。QQ只有在你在操作它的时候它CPu才会运作,你不操作它的时候它就是闲置的 ...

qq这个例子不行,因为qq本身就不应该是单纯单线程的
以字母为例:ABCD四个线程,按顺序A执行完,执行B,执行完B,执行C,在之后执行D;和A-B-C-D-A-D-B-C-A...这样执行完为什么说后一种高效?(除了拥堵问题以外)
作者: 黑马-雷钊    时间: 2013-5-8 15:15
这个可以这样理解。比如说程序本来的执行时间要100秒,但cpu处理它只要80秒。因为还有20秒是程序设定的时间。那么这20秒就是cpu的空闲时间了。和炒菜一样。你炒完个菜要10分钟,而你真正在炒在动的时间可能只有2分钟。因为大部分时间你都在等待。至于等什么我还真不好解释。反正就是在等 的时候你不能去炒菜。cpu在等的时候也不能去强行执行完程序。但假如cpu同时执行两个程序,你同时抄2个菜的话结果就不一样了。你完全可以把等的时间用来炒下一个菜。cpu也可以把等的时间执行下一个程序。
作者: 黑马-雷钊    时间: 2013-5-8 15:16
虽然干的活最后一样多。但把休息时间改成了工作时间。时间自然就缩短了。
作者: 不喝茶的陆羽    时间: 2013-5-8 18:02
黑马-雷钊 发表于 2013-5-8 15:15
这个可以这样理解。比如说程序本来的执行时间要100秒,但cpu处理它只要80秒。因为还有20秒是程序设定的时间 ...

哦i,但真的想知道具体在干什么...
作者: 兴朗ok    时间: 2013-5-8 19:39
多线程提高的是cpu的利用率,从而提高了运行效率,在单线程时,A执行时,B、C、D都在等待执行,而当A没有执行完时,其他三个不会有执行权。而在A遇到出错时,则整个程序就无法执行
而多线程是充分利用了cpu,在A其中有闲置的时候,就会运行其他的线程,四个线程同时在争夺着执行权。。。这样就会提高运行的效率。。
在实际应用中,当我们打开QQ,又打开360,又用迅雷下载等,这些同时运行时,会在cpu的快速切换中来运行,而若是单线程的话,那只能等QQ执行完,后才能去用360去检查电脑,后在用迅雷去下载,这样的话,若是QQ闲置的话,那么其他的程序就无法去执行,则降低了效率。。

作者: 黑马-雷钊    时间: 2013-5-8 23:30
不喝茶的陆羽 发表于 2013-5-8 18:02
哦i,但真的想知道具体在干什么...

嘿嘿   咱们是搞java的  只要知道程序在运行的时候是怎么运行的就行了   不能深究     
作者: 曹睿翔    时间: 2013-5-8 23:57
问题解决请编辑改为已解决,有疑问可以继续追问




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