gpt4 book ai didi

java - 线程如何知道前面有join方法

转载 作者:行者123 更新时间:2023-12-01 18:12:48 25 4
gpt4 key购买 nike

下面是我的示例代码,当我的 a.start() 调用时,它应该创建一个线程并立即打印“Run”。但为什么在打印“begin”20次后会被调用。

线程“a”如何决定不必立即调用 run()

public class JoinTest implements Runnable {

public static void main(String[] args) throws InterruptedException {
Thread a = new Thread(new JoinTest());
a.start();

for (int i = 0; i < 20; i++) {
System.out.print("Begin");
}
Thread.sleep(1000);

a.join();
System.out.print("\nEnd");
}

public void run() {
System.out.print("\nRun");
}
}

输出:

BeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBeginBegin
Run
End

我对线程的行为有点困惑。

我认为 "run" 应该在 "begin" 之前打印,因为它在调用 join() 方法之前打印,并且在调用线程“a”的 join 方法时,必须已完成其执行,此时调用 join 必定是无用的。

最佳答案

在线程上调用 start() 并不一定会立即触发其 run() 方法的执行。您的线程被标记为已启动,但主线程继续执行 for 循环。然后,一旦主线程到达 sleep() 语句,JVM 就会切换到您的线程。

关于java - 线程如何知道前面有join方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31719947/

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