在 java 中递归创建线程

Creating threads recursively in java

我有这段递归创建线程的代码,但我似乎无法弄清楚它是如何停止来自 运行 的线程的。

public class Recursive_Thread {

public static void main(String[] args) {

    int numThreads = 10;

    /* create and start thread 0 */

    System.out.println("Starting thread 0");
    Thread thread = new Thread(new Inner(0, numThreads));
    thread.start();        

    /* wait for thread 0 */

    try {
        thread.join();
    } catch (InterruptedException e) {}

    System.out.println("Threads all done");
}
/* inner class containing code for each thread to execute */

private static class Inner extends Thread {

    private int myID;
    private int limit;

    public Inner(int myID, int limit) {
        this.myID = myID;
        this.limit = limit;
    }

    public void run() {
        System.out.println("Hello World from " + myID);

        /* do recursion until limit is reached */
        if (myID == limit) {
              System.out.println("Good Bye World from " + myID);
        } else {
              System.out.println("Starting thread " + (myID+1));
              Thread thread = new Thread(new Inner((myID+1), limit));
              thread.start();
              try {
                  thread.join();
              } catch (InterruptedException e) {System.out.println("Well... That didn't go as planned!");}
              System.out.println("Thread " + (myID+1) + " finished");
              System.out.println("Good Bye World from " + myID);
        }
    }

}

我 运行 调试器和执行似乎在打印第 10 个线程的消息后经过此行后停止

System.out.println("Good Bye World from " + myID);

不知何故执行回到这些行

System.out.println("Thread " + (myID+1) + " finished");
System.out.println("Good Bye World from " + myID);

对于第 10 个线程之后的每个剩余线程。我如何从

if (myID == limit) {
              System.out.println("Good Bye World from " + myID);

else {
              System.out.println("Starting thread " + (myID+1));
              Thread thread = new Thread(new Inner((myID+1), limit));
              thread.start();
              try {
                  thread.join();
              } catch (InterruptedException e) {System.out.println("Well... That didn't go as planned!");}
              System.out.println("Thread " + (myID+1) + " finished");
              System.out.println("Good Bye World from " + myID);
        }

join 方法是否为程序创建了某种检查点,以便在完成所有 10 个线程的创建后返回?

当您使用 myId 9 启动新线程时,您将在 run 方法中遵循的代码路径是 else 分支。在此分支中,您使用 myId + 1 生成最后一个线程并等待最后一个线程加入。在第 46 行,您将打印“Thread x finished”消息,您还将在其中使用 myId + 1.

所以基本上,线程 9 的 run 方法将打印线程 10 已完成,线程 10 的 run 方法执行您正确假设的操作 - 使用 if 分支并只打印“再见”。

澄清一下:

  • 线程启动后打印“Hello World” run 方法的开始。
  • run 方法接近尾声时打印“再见”。线程在这里仍然存在,但会在打印完成后 return。
  • “Thread X finished”在线程 X 的外部 打印,因为它已经结束。外部表示在外线程中 (myId - 1) 或在线程 0 的主线程中。
  • 没有“Thread 0 finished”消息,因为在 0 的外线程(主线程 main)中没有这样的语句,而是“Threads all done”