睡眠线程什么时候继续在Java中执行?

时间:2013-03-31 14:36:54

标签: java multithreading concurrency

假设我在同一进程中运行了2个线程a和b。处理器从a运行一些指令,从b运行一些指令,直到达到如下代码行:Thread.sleep(1000)。

问题是我真的不明白处理器接下来会做什么。我怀疑这两个场景:

1)

  • 线程a开始休眠1000毫秒
  • 同时b正在运行
  • 1000毫秒的间隔结束了:
    • 如果proccessor仍然运行来自线程b的代码
      • 然后等到它完成
      • 并从Thread a
      • 运行更多代码
    • 否则
      • 从Thread a
      • 运行更多代码

2)

  • 线程a开始休眠1000毫秒
  • 同时b正在运行
  • 1000毫秒的间隔结束了:

    • 如果proccessor仍然运行Thread b的代码

      • STOP THREAD B.因为线程a具有更高的优先级,并且它的代码必须在1000毫秒间隔之后立即运行它已完成
      • 并从Thread a
      • 运行更多代码
      • 然后从我们离开的地方运行线程B的代码。
    • 否则
      • 从Thread a
      • 运行更多代码

哪一个类似于幕后实际发生的事情? 如果两者都错了,请告诉我正确的答案。

2 个答案:

答案 0 :(得分:4)

很多因素都会发挥作用,因此很难为你的问题提供绝对的答案。

但根据您提供的可用选项,#2 将是最接近的。

  

如果出现以下情况之一,则调用另一个线程来运行   事件发生:

     

....
  更高优先级的线程比当前运行的线程进入 Runnable 状态。优先级较低的线程是   抢占并计划运行优先级较高的线程。

这是source

答案 1 :(得分:3)

操作系统调度线程和进程,而不是处理器。它是如何做的取决于OS scheduler,它因操作系统而异。

即使JVM确实有线程调度程序the behavior ultimately does not depend on the JVM, but on the underlying OS scheduler

有关2.6 Linux调度程序的工作原理,请参阅this