了解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
将首先完成,然后是t2
, t3
和t4
。
它将以t1,t2,t3,t4 …连接的顺序终止,使得当前正在执行的线程等待,直到它被调用的线程终止。
有一个主线程可以启动你创建的四个关税线程t1,t2,t3和t4。 现在,当在线程上调用join()方法并且没有提供参数(时间)时(默认情况下它使0表示最长等待时间是永久的),则调用线程将等待调用连接的线程终止。
调用t1.start()时,JVM会调用相应的run()方法。 由于对于t1,waitsFor参数为null,因此只需通过打印它的名称即可终止。 由于你正在添加睡眠t2,t3,t4将在t1完成睡眠时开始。 现在t2将等待t1终止,因为我们从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/