gpt4 book ai didi

java - 为什么在 java 中 'joined' 线程启动之前 join() 方法之前的行不打印?

转载 作者:行者123 更新时间:2023-11-30 06:11:03 26 4
gpt4 key购买 nike

我知道当在一个线程内调用 join 方法时,该线程必须等待,直到“joined Thread”终止。但是如果在调用 join() 方法之前有更多代码 - 会发生什么?我在以下代码中发布了我的代码和困惑:

class MyJoinThread extends Thread {

public static Thread myMain;

public void run() {
for(int i = 0; i< 2; i++) {
System.out.println("I am loop");
}
try {
myMain.join();
}
catch(InterruptedException ex) {
ex.printStackTrace();
}

for(int j = 0; j < 5; j++) {
System.out.println("I am "+ Thread.currentThread().getName());
}
}
}

class MyJoinMainThread {
public static void main(String [] args) {
MyJoinThread.myMain = Thread.currentThread();
MyJoinThread th = new MyJoinThread();
th.start();

for(int i = 0; i<10; i++){
System.out.println("I am " + Thread.currentThread());
}
}


}

给定输出是:

I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am loop
I am loop
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0

为什么输出不是这样的?

   I am loop
I am loop
I am Thread[main,5,main]
.....
I am Thread[main,5,main]
I am Thread-0
..
I am Thread-0
I am Thread-0

我在主线程上调用 join() 方法之前包含一个循环。为什么在主线程开始执行之前不打印这一行?因为该循环是在调用 join() 方法之前调用的。

最佳答案

这是我运行程序时得到的结果(I am LoopI am Thread[main,5,main] 的顺序在每次运行后都会改变):

I am Thread[main,5,main]
I am loop
I am loop
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0

由于主线程中的 System.out.println("I am "+ Thread.currentThread()); 之间没有同步(并且没有发生之前关系 https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/happens-before.html )和 System.out.println("I am Loop"); 在第二个线程中,控制台中这些语句的顺序不保证。

实际顺序取决于调度程序以及 JVM 在您的 PC 上生成新线程所需的时间。

关于java - 为什么在 java 中 'joined' 线程启动之前 join() 方法之前的行不打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50221444/

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