Co oznacza ten kod dołączania do wątków?
Cytując z Thread.join()
metody javadocs :
join()
Czeka, aż ten wątek umrze.
Istnieje wątek, który uruchamia Twój przykładowy kod, który jest prawdopodobnie głównym wątkiem .
- Główny wątek tworzy i uruchamia wątki
t1
i t2
. Dwa wątki zaczynają działać równolegle.
- Główny wątek wywołuje
t1.join()
oczekiwanie na zakończenie t1
wątku.
- W
t1
finalizuje gwintu i t1.join()
powraca metody z głównym gwintem. Zauważ, że t1
mogło to już zakończyć się przed wykonaniem join()
połączenia, w takim przypadkujoin()
połączenie powróci natychmiast.
- Główny wątek wywołuje
t2.join()
oczekiwanie nat2
wątku.
- W
t2
finalizuje wątek (lub może być zakończona, zanim t1
zrobił nić) i t2.join()
powraca metoda w głównym wątku.
Ważne jest, aby zrozumieć, że wątki t1
i t2
działały równolegle, ale główny wątek, który je rozpoczął, musi poczekać na zakończenie, zanim będzie mógł być kontynuowany. To powszechny wzorzec. Ponadto, t1
i / lub t2
mógł skończyć się przed wywołaniem join()
ich przez główny wątek . Jeśli tak, to join()
nie będzie czekać, ale wróci natychmiast.
t1.join()
oznacza, że t2 zatrzymuje się, aż t1 się kończy?
Nie. Główny wątek, który wywołuje t1.join()
, przestanie działać i zaczeka na zakończenie t1
wątku. t2
Wątek jest uruchomiony równolegle i nie ma wpływu t1
lub t1.join()
rozmowa w ogóle.
Jeśli chodzi o try / catch, join()
rzuty InterruptedException
oznaczają, że wywoływany wątek główny join()
może sam zostać przerwany przez inny wątek.
while (true) {
Łączenia w while
pętli to dziwny wzór. Zazwyczaj pierwsze łączenie, a następnie drugie łączenie, obsługuje InterruptedException
odpowiednio w każdym przypadku. Nie ma potrzeby zapętlania ich.