Java Thread Join — метод, который может быть использован для того, чтобы приостановить выполнение текущего потока до тех пор, пока другой поток не закончит свое выполнение. Есть три перегруженных метода join()
.
Java Thread Join(). Теория
public final void join()
. Этот метод приостановит выполнение текущего потока до тех пор, пока другой поток не закончит свое выполнение. Если поток прерывается, бросается InterruptedException
.
public final synchronized void join(long millis)
: Этот метод приостановит выполнение текущего потока на указанное время в миллисекундах. Выполнение этого метода зависит от реализации ОС, поэтому Java не гарантирует, что текущий поток будет ждать указанное вами время.
public final synchronized void join(long millis, int nanos)
: Этот метод приостановит выполнение текущего потока до тех пор, пока другой поток не закончит свое выполнение на время заданное в миллисекундах плюс наносекундах.
Вот простой пример, показывающий использование метода join()
. Цель программы: убедиться в том, что третий поток начнет работу только тогда, когда первый закончит выполнение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
package ua.com.prologistic; public class ThreadJoinExample { public static void main(String[] args) { Thread t1 = new Thread(new MyRunnable(), "t1"); Thread t2 = new Thread(new MyRunnable(), "t2"); Thread t3 = new Thread(new MyRunnable(), "t3"); t1.start(); //стартуем второй поток только после 2-секундного ожидания первого потока (или когда он умрет/закончит выполнение) try { t1.join(2000); } catch (InterruptedException e) { e.printStackTrace(); } t2.start(); //стартуем 3-й поток только после того, как 1 поток закончит свое выполнение try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } t3.start(); //даем всем потокам возможность закончить выполнение перед тем, как программа (главный поток) закончит свое выполнение try { t1.join(); t2.join(); t3.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Все потоки отработали, завершаем программу"); } } class MyRunnable implements Runnable{ @Override public void run() { System.out.println("Поток начал работу:::" + Thread.currentThread().getName()); try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Поток отработал:::" + Thread.currentThread().getName()); } } |
Результат выполнения программы:
1 2 3 4 5 6 7 |
Поток начал работу:::t1 Поток начал работу:::t2 Поток отработал:::t1 Поток начал работу:::t3 Поток отработал:::t2 Поток отработал:::t3 Все потоки отработали, завершаем программу |
Следите за обновлениями раздела Многопоточность и параллелизм в Java
«Этот метод приостановит выполнение текущего потока до тех пор, пока другой поток не закончит свое выполнение. »
В официальной документации написанно: «join() — Waits for this thread to die.»