Po co wywoływać metodę Thread.currentThread.interrupt()
w bloku catch?
źródło
Po co wywoływać metodę Thread.currentThread.interrupt()
w bloku catch?
Ma to na celu utrzymanie stanu .
Kiedy złapiesz go InterruptException
i połkniesz, zasadniczo zapobiegniesz zauważeniu przerwania przez metody wyższego poziomu / grupy wątków. Co może powodować problemy.
Wywołując Thread.currentThread().interrupt()
, ustawiasz flagę przerwania wątku, aby programy obsługi przerwań wyższego poziomu zauważyły to i mogły odpowiednio obsłużyć.
Współbieżność języka Java w praktyce omówiono bardziej szczegółowo w rozdziale 7.1.3: Reagowanie na przerwanie . Jego zasada brzmi:
Tylko kod, który implementuje politykę przerywania wątku, może połknąć żądanie przerwania. Zadanie ogólnego przeznaczenia i kod biblioteki nigdy nie powinny połykać żądań przerwania.
InterruptedException
kasowania statusu przerwania, kiedy to robi. Myślę, że to wyjaśnia, dlaczego należy zachować stan przerwania.interrupt()
połączenie jest jedynym sposobem na ustawienie flagi przerwania, gdy otrzymałeś powiadomienie o tym stanie za pośrednictwem innego „mechanizmu dostarczania” -InterruptedException
i chcesz lub nie możesz go ponownie wysłać.Myślę, że ten przykład kodu wyjaśnia sprawę. Klasa, która wykonuje zadanie:
Główna klasa:
Spróbuj wywołać przerwanie bez przywracania stanu.
źródło
Uwaga:
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
Jak zatrzymać wątek, który czeka przez długi czas (np. Na dane wejściowe)?
Gwarantuje to, że Thread ponownie wywoła InterruptedException, gdy tylko będzie to możliwe.
źródło
Uznałbym to za złą praktykę lub przynajmniej trochę ryzykowną. Zwykle metody wyższego poziomu nie wykonują operacji blokujących i nigdy ich
InterruptedException
tam nie zobaczą . Jeśli zamaskujesz to w każdym miejscu, w którym wykonujesz operację przerywaną, nigdy jej nie uzyskasz.Jedynym uzasadnieniem dla
Thread.currentThread.interrupt()
i nie zgłaszania żadnego innego wyjątku lub sygnalizowania żądania przerwania w jakikolwiek inny sposób (np. Ustawienieinterrupted
zmiennej lokalnej w głównej pętli wątku) jest sytuacja, w której naprawdę nie można nic zrobić z wyjątkiem, jak wfinally
blokach.Zobacz odpowiedź Pétera Töröka, jeśli chcesz lepiej zrozumieć konsekwencje
Thread.currentThread.interrupt()
rozmowy.źródło
Zapoznaj się z dokumentacją java
Tak więc, jeśli zmienisz metodę sleepBabySleep () w @Ajay George Answer to I / O operation lub po prostu sysout, nie musisz ponownie ustawiać statusu, aby zatrzymać program. (BTW, nawet nie rzucają InterruptedException)
Tak jak powiedział @ Péter Török => Ma to na celu utrzymanie stanu. (Szczególnie w przypadku metody, która spowoduje zgłoszenie InterruptedException)
źródło