Понимание метода join()

Метод Java join 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();
    }
}

В каком порядке прекращаются потоки?

Ответы

Ответ 1

Что на самом деле смущает вас о Thread.join()? Вы не упомянули ничего конкретного.

Учитывая, что Thread.join() (как состояния документации), Waits for this thread to die, то t4 будет ждать завершения t3, что будет ждать t2, который будет ждать завершения t1.

Поэтому сначала будет завершено t1, а затем t2, t3 и t4.

Ответ 2

Он заканчивается в порядке t1, t2, t3, t4... join заставляет текущий исполняемый поток ждать, пока поток, который он вызывается при завершении.

Ответ 3

Существует основной поток, который запускает четыре таможенных потока, которые вы создали t1, t2, t3 и t4. Теперь, когда метод join() вызывается в потоке и не предоставляется аргумент (время) (что делает его 0 по умолчанию, поскольку максимальное время ожидания навсегда), то вызывающий поток будет ждать потока, для которого было вызвано соединение для завершения.

При вызове t1.start() соответствующий JVM-метод вызывает соответствующий метод run(). Поскольку аргумент waitsFor равен null для t1, он просто заканчивается, печатая его имя. Поскольку вы добавляете sleep t2, t3, t4 запускается к моменту t1, завершает его спящий режим. Теперь t2 будет ждать завершения t1, поскольку мы вызываем join на t1 из t2. Аналогично t3 будет ждать t2, а t4 будет ждать t3. Итак, выполнение youe будет t1->t2->t3->t4.

Однако, если t1 завершается до того, как t2 вызовет соединение на нем, соединение просто вернется, потому что в этой точке (когда t2 вызывает соединение на t1) isAlive() будет false.

Ответ 4

Конечно, порядок завершения потока будет от t1, t2 и т.д. здесь. Возможно, вы также получите четкое представление о методе join() в java-потоке и http://findnerd.com/list/view/Java-Thread-Join-Example/4465/