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

标签 java multithreading

下面是创建线程数组、启动它们,然后对它们调用 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/

相关文章:

Java Map getValue 不可能

c# - 将图像转换为灰度并行循环

mysqldump增加apache进程线程?

python - 尝试将数据传输到 arangodb 时数据变得困惑

multithreading - 线程计算OCaml

java - 如何在多个线程中执行 Spring 集成流程以并行使用更多 Amazon SQS 队列消息?

java - 为什么 Array<String> 是 kotlin 中 main 函数选择的参数类型?

java - 基于 JUnit 类别执行并行测试

java - 在 Java 中将字符串加倍

java - 从基类继承的接口(interface)是否应该在子类中显式实现?