Понимание метода 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/