Java 理解join()方法示例

Java 理解join()方法示例,java,multithreading,Java,Multithreading,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.pri

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+"] ");


线程的终止顺序是什么

它将按顺序t1、t2、t3、t4终止。。。join会导致当前正在执行的线程等待它被调用的线程终止。

关于
thread.join()
,究竟是什么让您感到困惑?你没有提到任何具体的事情

假设
Thread.join()
(as),
等待该线程死亡,那么
t4
将等待
t3
完成,这将等待
t2
完成,这将等待
t1
完成


因此,
t1
将首先完成,然后是
t2
t3
,和
t4
,有一个主线程,它启动您创建的四个自定义线程t1、t2、t3和t4。现在,如果在线程上调用join()方法,并且没有提供任何参数(time)(默认情况下为0,表示最大等待时间是永久的),那么调用线程将等待调用join的线程终止

调用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()方法有一个清晰的了解,这是一个技巧性的问题吗?还是家庭作业?:)读了一些电子书,发现这个例子,实际上执行线程等待调用连接的线程完成,也许我今天应该退出:DWaits等待线程死亡@Giacomo,没错,这就是为什么我在任何人注意到(几乎无论如何;)
waitsFor=wa
构造函数内部之前删除了它。
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();
    }
}