gpt4 book ai didi

java - 是否可以不执行一条指令就退出 RUNNABLE 状态?

转载 作者:搜寻专家 更新时间:2023-11-01 02:23:47 24 4
gpt4 key购买 nike

我正在看书Oracle Certified Professional Java SE 7 Programmer Exams 1Z0-804 and 1Z0-805 .其中一个问题询问这段代码的输出

class ThreadTest {
public static void main(String []args) throws InterruptedException {
Thread t1 = new Thread() {
public void run() { System.out.print("t1 "); }
};
Thread t2 = new Thread() {
public void run() { System.out.print("t2 "); }
};
t1.start();
t1.sleep(5000);
t2.start();
t2.sleep(5000);
System.out.println("main ");
}
}

书上说它总是输出t1 t2 main 因为TIMED_WAITING state 只能从 RUNNABLE 到达状态。

但我在想一个线程可以退出 RUNNABLE没有执行任何指令的状态。

文档说:

A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor.

书上的答案对吗?是否可以退出 RUNNABLE没有执行一条指令的状态?

最佳答案

我不相信这本书是正确的,但出于不同的原因。

首先让我们直接处理您的问题。改变 RUNNABLE 状态的唯一方法是执行一条导致其状态改变的指令。该指令可能会调用一个方法(恰好是同步的,然后线程在 BLOCKED 中等待锁定)或从 run() 方法返回(导致线程变为 TERMINATED)。但是这些状态变化总是会发生,因为线程已经做了一些事情来改变自己的状态。

编辑 - 只是为了详细说明这一点; public void run() {} 方法恰好包含一条指令:return。线程必须执行 return 才能从 RUNNABLE 变为 TERMINATED。

这本书错了(有点)。在“正常情况”下,5 秒足以启动一个线程。但是没有同步线程,因此没有强制线程以任何特定顺序执行操作。

流程是:

  1. 主线程在 t1 开始。
  2. 然后主线程进入 hibernate 状态 5 秒。 您希望 5 秒足以让操作系统启动一个线程,但不能保证一定会。如果操作系统当前受到 fork bomb 的攻击它可能没有启动新线程的资源。
  3. 然后主线程开始 t2。 如果操作系统完全阻塞并且 t1 尚未启动,则无法保证 t2 不会首先启动(执行某些代码)。
  4. 然后主线程进入 hibernate 状态 5 秒。
  5. 然后主线程打印"main "。同样,如果操作系统出现阻塞,这实际上可能会在 t1 或 t2 开始之前发生。

在不使用同步的情况下,永远不要依赖多个线程的序列!

关于java - 是否可以不执行一条指令就退出 RUNNABLE 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31274703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com