进入阻塞的线程会霸占cpu吗

进入阻塞的线程会霸占cpu吗

如果一个线程进入阻塞,那么cpu是空出来给其他线程还是由原线程占据,只是不运行

正在回答

登陆购买课程后可参与讨论,去登陆

5回答

同学你好,

  1. 因为Thread-2自己的线程还没有结束,只是因为没有抢占到CPU,其他的线程不会影响Thread-2线程中的内容。

  2. 如果同学对底层有很大的兴趣,同学可以多去网上查阅资料或买一些java相关的书籍阅读,因为我们现在学的知识是循序渐进的,最好的途径就是先不要过深的研究底层原理,因为过于专业的词汇可能会影响初学者的思维,建议同学跟着老师上课的步骤多敲代码,对于java来讲,还是要有代码量作为基础,一定要拿出时间来敲代码,用代码量来丰富自己的思维,不钻牛角尖,这是作为初学者甚至到以后成为程序员必须要做的,才能够更好的理解代码体系及底层架构。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快~

好帮手慕小琪 2020-05-08 14:24:17

同学你好,老师对同学的问题一一解答。

1. 如果一个线程进入阻塞,那么cpu是空出来给其他线程还是由原线程占据,只是不运行
    上面同学的回答是正确的。一个线程进入阻塞,CPU会执行其他的线程。

2. CPU是划分时间片给线程轮流使用的 但是sleep的时间明显超过时间片大小,执行sleep的时候是怎么回事呢 强行霸占多个时间片直到指定时间运行结束吗?
    java虚拟机是采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的线程优回先级相同,那么就随机选择一个线程,使其占用CPU,而优先级的划分是在虚拟机内部进行的,我们不用知道内部是怎样执行的。处于运行状态的线程会一直运行,直至它不得不放弃CPU。线程进入阻塞时,不会占用CPU,超出时间片时间也没关系,阻塞的线程不会霸占时间片,等到结束等待后,线程才会重新加入就绪队列,等待结束后的下一次时间片的划分就可以了。

3. 为什么没有按照for循环顺序依次输出。为什么顺序会错乱,多线程为什么可能不按照从大到小的顺序

    同学的代码中有5个线程,没按照顺序执行是因为这是线程之间在进行CPU资源的抢占的结果。

    例如同学输出语句中出现下图部分的原因,老师给同学解释一下:

http://img1.sycdn.imooc.com//climg/5eb4f3cb09a1f77b11070302.jpg

    正常的顺序应该是74,73,72,而执行结果是74,72,73。这就是上面说到的线程之间在进行CPU资源的抢占的结果,Tread-3抢到CPU之后执行了一次run()方法,接着Tread-2抢到了CPU,但因为Tread-2比较弱,还没执行完run()方法,只执行了一句递减语句,就被Tread-0把CPU抢走了,然后Tread-0执行了一次run()方法,接着才把CPU让给Tread-2进行输出,所以执行结果变成了74,72,73。也和上面同学的回答是相同意思的。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快~

  • 提问者 源治泷谷 #1
    thread 2只执行了n=n-1变成n=73还未输出,thread 0抢占了cpu n=n-1变成72并输出了 此时计数为71 那么这个时候thread 2在执行输出语句 输出n 为什么不会受thread 0影响直接输出71 而是 输出原来的73呢。这些偏底层的知识有什么推荐的学习途径吗
    2020-05-08 14:55:59
苍星乱舞 2020-05-08 00:18:12

同一个线程里一定是按从大到小的

sleep就是阻塞,阻塞是不会占用CPU的,要等阻塞的原因结束,线程才会重新加入就绪队列,等待下一次时间片的划分

  • 提问者 源治泷谷 #1
    阻塞不占用cpu也就是说当当前线程sleep后,期间cpu会空出来给其他线程使用吗。还有多线程为什么可能不按照从大到小的顺序
    2020-05-08 00:24:22
  • 苍星乱舞 回复 提问者 源治泷谷 #2
    CPU当然不可能等你阻塞,你要有CPU停止一秒,你电脑就都黑屏了,操作系统都没法跑了。 你先拿到大的号码,但是CPU被我占用了,我拿小的号码,先输出了,你手上还有大的号码。
    2020-05-08 00:32:07
提问者 源治泷谷 2020-05-08 00:05:01

另外为什么循环输出http://img1.sycdn.imooc.com//climg/5eb431070900ed0307590697.jpg

为什么没有按照for循环顺序依次输出。就算线程是随机分配cpu执行的,但是既然先分配到了一个线程,那么他应该先做获得76啊 为什么顺序会错乱,递减的for循环里一个线程先得到72然后下一个线程循环的到73?

提问者 源治泷谷 2020-05-08 00:01:31

还有 cpu是划分时间片给线程轮流使用的 但是sleep的时间明显超过时间片大小,执行sleep的时候是怎么回事呢 强行霸占多个时间片直到指定时间运行结束吗

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师