2016-12-15 49 views
1

下面是创建线程,数组的代码启动它们,然后调用加入他们:Java线程加入for循环,未知行为输出

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"); 
} 

} 

我知道,加入等待线程在继续之前死亡,并且线程可能不按顺序调用,但仍将完成其任务。问题是我的输出中有这么多异常。有人可以解释为什么这样的事情可能会发生:

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 

这是因为那是在进入连接循环之前计划开始的线程之一吗?

+0

线程97输出的其余部分应该在下面的某处。不是吗? – GurV

回答

1

这不是异常行为。当调用线程#加入时,主线程只需等待该特定线程完成,然后继续执行。因为每个线程都有单独的指令流,它们都将按照任意给定的顺序执行,正如您通过随机“异常值”所看到的那样。