2008-10-22 17 views
25

Jestem stosunkowo nowy w wątku w Javie i zauważyłem, że za każdym razem, gdy używam Thread.sleep(), muszę złapać wyjątek InterrupetdException.Jakie zachowanie powoduje przerwany wyjątek?

Jakie zachowanie to powoduje, aw prostych aplikacjach, w których mam wątek monitorowania, mogę po prostu zignorować wyjątek?

+0

podobne do tego pytania: http://stackoverflow.com/questions/17494717/why-a-thread-would-interrupt-another-thread/17495107#17495107 –

Odpowiedz

-3

Jeśli inny wątek dzwoni thread.interupt(), gdy wątek śpi, otrzymasz wyjątek. I tak, prawdopodobnie możesz po prostu wstawić próbkę dookoła snu() i zignorować ją;)

+19

zdegradowany, ponieważ nigdy nie powinno * * ignorować Każdy wyjątek prowadzi do nieudokumentowanych zachowań i błędów. Albo zapisz go, albo rozpakuj. –

+0

Połknięcie wyjątku InterruptedException komplikuje zdolność aplikacji do anulowania działań lub zamknięcia w odpowiednim czasie. Więcej informacji tutaj http://www.ibm.com/developerworks/library/j-jtp05236/ –

+0

Podczas gdy jedno zdecydowanie nie powinno ignorować większości wyjątków. Jest to doskonały przykład wyjątku, który w niektórych przypadkach może zostać zignorowany. Na przykład, gdy odniesienie do wątku istnieje tylko w zakresie, wtedy nie jest możliwe nieoczekiwane zachowanie. Jesteśmy Inżynierami Oprogramowania i powinniśmy myśleć sami. Jeśli nawet nie zapytasz sam siebie, dlaczego najlepiej radzić sobie z wyjątkami, prawdopodobnie jesteś złym inżynierem. –

3

Głównym przypadkiem jest, gdy ktoś dzwoni pod numer Thread.interrupt().

Bezpieczniej jest rzucić wyjątek RuntimeException, jeśli dzieje się tak, gdy naprawdę się tego nie spodziewasz, ale w bardzo prostych przypadkach możesz go zignorować.

-1

InterruptedException to sprawdzony wyjątek, więc niestety nie można go zignorować. W najprostszych przypadkach nie musisz nic robić w klauzuli catch, ponieważ masz pewność, że tak się nie stanie.

Od API

wyrzucony, gdy wątek jest oczekiwanie, spanie, albo inaczej wstrzymane przez długi czas i inny wątek przerywa go przy użyciu metody przerwania w klasie Thread.

3

Z javadocs:

Klasa InterruptedException

wyrzucony, gdy wątek jest oczekiwanie, spania, lub w inny sposób przerwał na dawna i inny wątek przerywa go za pomocą przerwanie Metoda w klasie Wątek.

Mam nadzieję, że odpowiedź na twoje pytanie.

5

Jak powiedzieli inni, jest to spowodowane przez inny wątek wywołujący interrupt() na obiekcie, który śpi w trybie .

Oznacza to, że inny wątek postanowił anulować wątek. Dostępny jest blok try/catch, dzięki któremu możesz z wdziękiem obsłużyć anulowanie wątku i bezpiecznie wyczyścić wszelkie zasoby lub zamknąć wszystkie operacje, które wykonał poprawnie.

Jeśli faktycznie nie musisz tego robić, to tak, nadal potrzebujesz pustego bloku catch. Ale to dla ciebie Java ...

23

Zdarza się, gdy coś wywołuje interrupt() w wątku. This article by Brian Goetz wyjaśnia mechanizm przerywania i jak należy obsługiwać InterruptedExceptions:

„Najczęstszą odpowiedzią InterruptedException jest to przełknąć - go złapać i nic nie robić (czy może zalogować się, co nie ma nic lepszego) - - jak zobaczymy później na listingu 4.Niestety, takie podejście powoduje odrzucenie ważnych informacji o tym, że wystąpiło przerwanie, które może wpłynąć negatywnie na możliwość anulowania działań lub zamknięcia w odpowiednim czasie. "

" Jeśli wykryjesz wyjątek InterruptedException, ale nie możesz go ponownie rzucić, powinieneś zachować dowody na to, że nastąpiło przerwanie [...]. Zadanie to jest realizowane poprzez wywołanie przerwania() do „reinterrupt” aktualny wątek „

+2

Dziękuję za poruszenie tego punktu. To PITA musi zarządzać InterruptedExceptions, ale jest to ważne. –

6

kilka rad z Java współbieżności w praktyce.

  • propagowanie wyjątku (ewentualnie po jakimś zadaniem specyficznych porządki), co czyni metodę przerywanych sposobu blokowania, zbyt lub
  • przywracania stanu przerwania tak, że kod wyżej na stosie wywołań może sobie z tym poradzić
  • Tylko kod, który implementuje polityki przerwanie wątku jest. może połknąć prośbę o przerwanie. Kod zadań i biblioteki ogólnego przeznaczenia nie powinien nigdy przechwytywać żądań przerwania.
Powiązane problemy