了解join()方法示例

Java线程join()方法让我感到困惑。 我有以下例子

class MyThread extends Thread { private String name; private int sleepTime; private Thread waitsFor; MyThread(String name, int stime, Thread wa) { … } public void run() { System.out.print("["+name+" "); try { Thread.sleep(sleepTime); } catch(InterruptedException ie) { } System.out.print(name+"? "); if (!(waitsFor == null)) try { waitsFor.join(); } catch(InterruptedException ie) { } System.out.print(name+"] "); 

 public class JoinTest2 { public static void main (String [] args) { Thread t1 = new MyThread("1",1000,null); Thread t2 = new MyThread("2",4000,t1); Thread t3 = new MyThread("3",600,t2); Thread t4 = new MyThread("4",500,t3); t1.start(); t2.start(); t3.start(); t4.start(); } } 

线程以什么顺序终止?

什么让你对Thread.join()感到困惑? 你没有提到任何具体的东西。

鉴于Thread.join() (如文档所述 ), Waits for this thread to die ,然后t4将等待t3完成,这将等待t2完成,这将等待t1完成。

因此t1将首先完成,然后是t2t3t4

它将以t1,t2,t3,t4 …连接的顺序终止,使得当前正在执行的线程等待,直到它被调用的线程终止。

有一个主线程可以启动你创建的四个关税线程t1,t2,t3和t4。 现在,当在线程上调用join()方法并且没有提供参数(时间)时(默认情况下它使0表示最长等待时间是永久的),则调用线程将等待调用连接的线程终止。

调用t1.start()时,JVM会调用相应的run()方法。 由于对于t1,waitsFor参数为null,因此只需通过打印它的名称即可终止。 由于你正在添加睡眠t2,t3,t4将在t1完成睡眠时开始。 现在t2将等待t​​1终止,因为我们从t2调用t1上的join。 类似地,t3将等待t2,t4将等待t3。 所以执行将进入t1->t2->t3->t4

但是如果t1在t2调用join之前终止,则join将返回,因为在那一点(当t2调用t1上的join时) isAlive()将为false

当然,线程终止的顺序来自t1,t2,依此类推。 也许你会从这里清楚地了解java线程中的join()方法http://findnerd.com/list/view/Java-Thread-Join-Example/4465/