多线程和单线程有什么本质区别

bear234 2015-12-07 05:36:54
理解1:如果是多核,那么可以在物理上真实地做到同一时间做多个线程;而如果是单核,那么即使是多线程,一个时刻也只能做一个线程。

理解二:在单核的前提下,假如有10个任务。如果用单线程,那么我可以依次做这10个任务-----做完地一个做第二个做完第二个做第三个......而如果用多线程的话,等效于有一个任务队列,我run了这10个任务线程等于把这10个线程都插入了这个任务队列中,然后这10个任务去抢CPU。感觉上有点异步的味道:我不必等一个任务完成了才能执行第二个、我不必等这10个任务都完成了才能继续往下走。



这两个理解有什么错误的地方吗?
...全文
11878 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34614830 2017-04-25
  • 打赏
  • 举报
回复
谢谢楼上的解析
hirunhysoft 2017-04-23
  • 打赏
  • 举报
回复 1
这个帖子比较久了,偶然看到,发现大家对单线程与多线程编程最关键的问题没有讨论,因此补充几点: (1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高。单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进程及线程的切换开销, (2)实际上,多线程的出现主要为了解决IO设备的读写速度往往比CPU的处理速度慢造成的单线程程序运行阻塞问题,一个极端的例子就是如果你需要用户在键盘上输入一个数据,当用户没有输入前,单线程程序就阻塞了,多线程程序就可以放个音乐或继续干一些程序中除了键盘输入外的工作,因此,多线程能提高因程序由于等待某个资源阻塞时其他资源的利用率(是利用率不是效率)。 (3)因此多线程与单线程的最大区别,多线程程序能在等待某个IO操作时,继续完成非这个IO的其他工作,有利于提高完成整个任务的效果和速度。此外,多线程程序与单线程程序对程序设计也有不同的流程和结构,多线程需要考虑对静态变量等资源的操作互锁及程序执行的同步问题。
qq_21992489 2015-12-08
  • 打赏
  • 举报
回复
其实电脑同时处理多个进程的时候 处理过程依然是 花费0.01秒处理一个进程 再花费0.01秒处理下一个进程 以此类推 多看看操作系统 就知道了
bdmh 2015-12-08
  • 打赏
  • 举报
回复
你说的没错,对于单核,除了可以避免假死,时间上不一定能节省,但对于多核cpu,可能就真的可以实现并行计算,那样效率就大大提高了
alan19931103 2015-12-08
  • 打赏
  • 举报
回复
都对啊。多线程是程序的概念,和操作系统是不是多核没有关系,这个事情我当时也纠结了好久,回炉再看看操作系统原理,好好理解一下线程,进程,作业,任务之类的细微差别。 多核和不多核只是在操作系统层面能不能同时执行多个任务而已,对于软件来说这个无关的或者说是屏蔽的。 在软件层面,多线程就是能同时从多个路线同时执行处理。从软件的角度来说,线程可以看作是同时的。即便在单核处理器的电脑上也能实现多线程。但是多个线程毕竟是要在cpu上跑的,一定会有一个先后,所以这就涉及到了cpu的调度问题,但是这已经超出了软件本身的层面,所以在撸代码的时候只要时刻保证自己清醒的知道多线程虽然同时执行,但并不是每一刻都同时,你可以理解为任意一段时间内,所有线程都得到了相近工作量的计算。java中不是有给线程设置优先级的方法吗,就是这个影响一下cpu调度顺序。 针对你提的第一个问题,印象中不同的处理器架构处理方式好像不一样,有的多核也只能某一时刻处理一个线程,因为一个程序的任务好像不会分配到不同处理器上(需要求证!)。 第二个问题,单核的过程也是多线程,每个线程处理一小段时间,然后切换到另一个线程,所以有可能你判断玩i++<10,进入循环。然后切换到另外的线程去了,里面i=100,又切换回来,这个时候记得程序就死定了。所以多线程的困难就是处理原子操作。后面基本理解没有什么错,但是肯定不会是队列,至少也要是优先级队列,这个书上应该有很详细的说明(印象中)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧