正在回答
同学你好,
因为Thread-2自己的线程还没有结束,只是因为没有抢占到CPU,其他的线程不会影响Thread-2线程中的内容。
如果同学对底层有很大的兴趣,同学可以多去网上查阅资料或买一些java相关的书籍阅读,因为我们现在学的知识是循序渐进的,最好的途径就是先不要过深的研究底层原理,因为过于专业的词汇可能会影响初学者的思维,建议同学跟着老师上课的步骤多敲代码,对于java来讲,还是要有代码量作为基础,一定要拿出时间来敲代码,用代码量来丰富自己的思维,不钻牛角尖,这是作为初学者甚至到以后成为程序员必须要做的,才能够更好的理解代码体系及底层架构。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快~
同学你好,老师对同学的问题一一解答。
1. 如果一个线程进入阻塞,那么cpu是空出来给其他线程还是由原线程占据,只是不运行
上面同学的回答是正确的。一个线程进入阻塞,CPU会执行其他的线程。
2. CPU是划分时间片给线程轮流使用的 但是sleep的时间明显超过时间片大小,执行sleep的时候是怎么回事呢 强行霸占多个时间片直到指定时间运行结束吗?
java虚拟机是采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的线程优回先级相同,那么就随机选择一个线程,使其占用CPU,而优先级的划分是在虚拟机内部进行的,我们不用知道内部是怎样执行的。处于运行状态的线程会一直运行,直至它不得不放弃CPU。线程进入阻塞时,不会占用CPU,超出时间片时间也没关系,阻塞的线程不会霸占时间片,等到结束等待后,线程才会重新加入就绪队列,等待结束后的下一次时间片的划分就可以了。
3. 为什么没有按照for循环顺序依次输出。为什么顺序会错乱,多线程为什么可能不按照从大到小的顺序
同学的代码中有5个线程,没按照顺序执行是因为这是线程之间在进行CPU资源的抢占的结果。
例如同学输出语句中出现下图部分的原因,老师给同学解释一下:
正常的顺序应该是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。也和上面同学的回答是相同意思的。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快~
相似问题
登录后可查看更多问答,登录/注册
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星