gpt4 book ai didi

java - JVM按顺序启动线程的run()方法的保证是什么

转载 作者:行者123 更新时间:2023-12-01 22:15:43 24 4
gpt4 key购买 nike

对于下面的程序,答案是 --> print : printName ,然后等待 5 秒,然后 print : printValue

但据我所知,由 JVM 选择一个线程并启动其 run 方法。那么为什么它不能(打印值打印名称然后暂停 5 秒)。

注意:我理解同步方法的概念,但是我们如何确定 JVM 将始终选择线程 t1 作为其第一个线程。

class B {
public synchronized void printName() {
try {
System.out.println("printName");
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
}
}

public synchronized void printValue() {
System.out.println("printValue");
}
}

public class Test1 extends Thread {
B b = new B();

public static void main(String argv[]) throws Exception {
Test1 t = new Test1();
Thread t1 = new Thread(t, "t1");
Thread t2 = new Thread(t, "t2");
t1.start();
t2.start();
}

public void run() {
if (Thread.currentThread().getName().equals("t1")) {
b.printName();
} else {
b.printValue();
}
}
}

最佳答案

在此上下文中,synchronize 只是表示它们不能同时运行,而不是表示它们必须按顺序运行。如果您希望它们按顺序运行,那么您不需要线程,或者您需要更复杂的排队机制。

因此,您是正确的,它可以是“printName”暂停“printValue”“printValue”“printName”暂停。

如果您多次运行该程序,您可能会更频繁地看到第一个程序。您偶尔会看到第二个输出。出现偏差是因为线程 1 上的 start() 和线程 2 上的 start() 之间存在轻微延迟。

关于java - JVM按顺序启动线程的run()方法的保证是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079289/

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