Java thread 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();
}
}
线程终止的顺序是什么?
答案 0 :(得分:12)
您真正对Thread.join()
感到困惑的是什么?你没有提到具体的事情。
鉴于Thread.join()
(为the documentation states),Waits for this thread to die
,t4
将等待t3
完成,等待t2
完成,等待t1
完成。
因此,t1
将首先完成,然后是t2
,t3
和t4
。
答案 1 :(得分:6)
它将以t1,t2,t3,t4 ...连接的顺序终止,导致当前正在执行的线程等待,直到它被调用的线程终止。
答案 2 :(得分:2)
有一个主线程可以启动你创建的四个海关线程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
。
答案 3 :(得分:0)
线程终止的顺序当然是来自t1,t2等等。也许您将从此处清楚地了解java线程中的join()方法http://findnerd.com/list/view/Java-Thread-Join-Example/4465/