19.为什么Java线程没有Running状态

(1)一个在JVM中执行的线程处于Runnable这一状态,runnable状态与ready状态的区别为:
处于 runnable 状态下的线程正在 Java 虚拟机中执行,但它可能正在等待来自于操作系统的其它资源,比如处理器。显然,runnable状态实质上是包括了ready状态的。
(2)对于Java线程状态来说,不存在running状态,runnable状态包含了running状态。
现在的时分多任务操作系统架构通常都是“时间分片”方式进行抢占式轮转调度。更复杂的可能还会加入优先级(priority)的机制。这个时间分片通常是很小的,一个线程一次最多只能在 cpu 上运行比如10-20ms 的时间(此时处于 running 状态),也即大概只有0.01秒这一量级,时间片用后就要被切换下来放入调度队列的末尾等待再次调度。(也即回到 ready 状态)
这一过程叫做线程的上下文切换,把相应的执行状态保存在内存以便后续的恢复执行。所以说单核CPU所谓的“并发”都是快速切换所带来的假象。
当看到监控上显示是 running 时,对应的线程可能早就被切换下去了,甚至又再次地切换了上来,也许你只能看到 ready 与 running 两个状态在快速地闪烁。
(3)当I/O阻塞时
传统的I/O是阻塞式操作和cpu相比太慢,如果让cpu去等I/O的操作,可能时间片用完I/O操作都没完成。
解决办法:一旦线程中执行到I/O有关的代码,相应线程立马切走,调度ready队列中另一个线程来运行。当I/O操作结束后,cpu会收到来自硬盘的中断信号,并进入中断处理流程,回到ready队列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值