在 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”
我有这段递归创建线程的代码,但我似乎无法弄清楚它是如何停止来自 运行 的线程的。
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”