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
t1i t2. Dwa wątki zaczynają działać równolegle.
- Główny wątek wywołuje
t1.join()oczekiwanie na zakończenie t1wątku.
- W
t1finalizuje gwintu i t1.join()powraca metody z głównym gwintem. Zauważ, że t1mogł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 nat2wątku.
- W
t2finalizuje wątek (lub może być zakończona, zanim t1zrobił nić) i t2.join()powraca metoda w głównym wątku.
Ważne jest, aby zrozumieć, że wątki t1i t2dział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, t1i / lub t2mó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 t1wątku. t2Wątek jest uruchomiony równolegle i nie ma wpływu t1lub t1.join()rozmowa w ogóle.
Jeśli chodzi o try / catch, join()rzuty InterruptedExceptionoznaczają, że wywoływany wątek główny join()może sam zostać przerwany przez inny wątek.
while (true) {
Łączenia w whilepętli to dziwny wzór. Zazwyczaj pierwsze łączenie, a następnie drugie łączenie, obsługuje InterruptedExceptionodpowiednio w każdym przypadku. Nie ma potrzeby zapętlania ich.