3

假设我有 2 个线程 a 和 b 在同一个进程中运行。处理器从 a 运行一些指令,从 b 运行一些指令,依此类推,直到它到达这样的代码行:Thread.sleep(1000)。

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

1)

  • 线程 a 开始休眠 1000 毫秒
  • 同时 b 正在运行
  • 1000 毫秒的间隔结束了,所以:
    • 如果处理器仍然从线程 b 运行代码
      • 然后等到它完成
      • 并从 Thread a 运行更多代码
    • 别的
      • 从 Thread a 运行更多代码

2)

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

    • 如果处理器仍然从线程 b 运行代码

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

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

4

2 回答 2

4

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

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

如果发生以下事件之一,则会调用不同的线程来运行:

....比当前运行的
线程具有更高优先级的线程进入Runnable状态。低优先级线程被抢占,高优先级线程被调度运行。

这是来源

于 2013-03-31T14:49:53.553 回答
3

调度线程和进程的是操作系统,而不是处理器。它是如何工作的取决于操作系统调度程序,并且它因操作系统而异。

即使 JVM 确实有线程调度程序,其行为最终也不取决于 JVM,而是取决于底层 OS 调度程序

请参阅此处了解 2.6 Linux 调度程序的工作原理。

于 2013-03-31T14:42:01.040 回答