gpt4 book ai didi

Java线程加入for循环,输出中的未知行为

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

下面是创建线程数组、启动它们,然后对它们调用 join 的代码:

public class JoinExample {

private static class CodeForThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}

public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[100];
for (int i = 0; i < 100; i++){
threads[i] = new Thread(new CodeForThread());
threads[i].start();
}
for (int i = 0; i < threads.length; i++) {
threads[i].join();
}
System.out.println("All Done");
}

}

我知道 join 会等待线程死亡后再继续,并且线程可能会被乱序调用,但仍会完成其任务。问题是我的输出中有如此多的异常值。有人可以解释一下为什么会发生这样的事情吗:

Thread-60 0
Thread-60 1
Thread-60 2
Thread-60 3
Thread-60 4
Thread-97 0 //***
Thread-59 0
Thread-59 1
Thread-59 2
Thread-59 3
Thread-59 4

这是因为这是在进入 join 循环之前安排启动的线程之一吗?

最佳答案

这不是异常行为。调用 Thread#join 时,主线程只需等待特定线程完成,然后再继续执行。因为每个线程都有一个单独的指令流,所以它们都将以任何给定的顺序执行,正如您在随机“异常值”中看到的那样。

关于Java线程加入for循环,输出中的未知行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41155943/

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