Kiedy funkcja Thread.sleep języka Java zgłasza wyjątek InterruptedException? Czy można to bezpiecznie zignorować? Nie robię wielowątkowości. Chcę tylko poczekać kilka sekund przed ponowną próbą wykonania jakiejś operacji.
110
Kiedy funkcja Thread.sleep języka Java zgłasza wyjątek InterruptedException? Czy można to bezpiecznie zignorować? Nie robię wielowątkowości. Chcę tylko poczekać kilka sekund przed ponowną próbą wykonania jakiejś operacji.
InterruptedException
Wyjątkiem jest złapany, więc nie można kompilować chyba że uchwyt lub zadeklarować ten typ wyjątku na każdą metodą, która łączy czy śpiThread
, czy rozmówwait()
na tematObject
.Odpowiedzi:
Generalnie NIE powinieneś ignorować wyjątku. Spójrz na następujący artykuł:
Zobacz cały artykuł tutaj:
http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-
źródło
Jeśli
InterruptedException
zostanie wyrzucony, oznacza to, że coś chce przerwać (zwykle zakończyć) ten wątek. Jest to wyzwalane przez wywołanieinterrupt()
metody wątków . Metoda wait wykrywa to i generuje,InterruptedException
aby kod catch mógł obsłużyć żądanie zakończenia natychmiast i nie musi czekać, aż upłynie określony czas.Jeśli używasz go w aplikacji jednowątkowej (a także w niektórych aplikacjach wielowątkowych), ten wyjątek nigdy nie zostanie wyzwolony. Ignorowanie go przez posiadanie pustej klauzuli catch, nie polecam. Rzutowanie
InterruptedException
czyści stan przerwania wątku, więc jeśli nie zostanie prawidłowo obsłużony, informacja zostanie utracona. Dlatego proponuję uruchomić:Co ponownie ustawia ten stan. Następnie zakończ wykonanie. To byłoby poprawne zachowanie, nawet trudne, nigdy nie używane.
Lepiej byłoby dodać to:
... oświadczenie do bloku catch. Zasadniczo oznacza to, że nigdy nie może się to zdarzyć. Więc jeśli kod zostanie ponownie użyty w środowisku, w którym może się to zdarzyć, będzie narzekać.
źródło
RuntimeException
.Biuletyn Java Specialists (który mogę bez zastrzeżeń polecić) zawierał interesujący artykuł na ten temat i jak sobie radzić z
InterruptedException
. Warto go przeczytać i przetrawić.źródło
Metody takie jak
sleep()
iwait()
klasyThread
mogą generować plikInterruptedException
. Stanie się tak, jeśli ktoś inny będziethread
chciał przerwać to,thread
co czeka lub śpi.źródło
Solidnym i łatwym sposobem obsługi tego w kodzie jednowątkowym byłoby przechwycenie go i pobranie go w RuntimeException, aby uniknąć konieczności deklarowania go dla każdej metody.
źródło
InterruptedException
Zwykle jest generowany, gdy sen jest przerywany.źródło