2014-11-11 16 views
11

Istnieją interesujące pytania i odpowiedzi dotyczące Javy InterruptedException, na przykład The Cause of InterruptedException i Handling InterruptedException in Java. Jednak żaden z nich nie mówi mi o możliwych źródłach wyjątku InterruptedException.InterruptedException: co to powoduje?

Co z sygnałami OS, takimi jak SIGTERM, SIGQUIT, SIGINT? Czy naciśnięcie CTRL-C na linii poleceń powoduje wystąpienie wyjątku InterruptedException? Co jeszcze?

+0

Ten artykuł może pomóc w zrozumieniu tego mechanizmu: [Co robisz z przerwanym wyjątkiem?] (Http://www.yegor256.com/2015/10/20/interrupted-exception.html) – yegor256

Odpowiedz

16

Żadna z wymienionych rzeczy nie daje InterruptedException.

Jedyne, co może przerwać wątek, to połączenie z numerem Thread#interrupt(). JLS jest stosunkowo jasny w tej dziedzinie, z section 17.2.3:

17.2.3 Przerwy

działania przerwami wystąpić po wywołaniu Thread.interrupt, jak zdefiniowano sposoby wywołania to z kolei, jak ThreadGroup.interrupt.

Zobacz także the official tutorial on interrupts, aby uzyskać więcej informacji. W szczególności:

Gwint wysyła przerwanie powołując interrupt na obiekcie Thread do gwintu była przerwana. Aby mechanizm przerwań działał poprawnie, przerwany wątek musi obsługiwać własne przerwanie.

...

Mechanizm przerwań jest realizowany przy użyciu flagi wewnętrzne znany jako status przerwania. Wywołanie Thread.interrupt ustawia tę flagę. Gdy wątek sprawdza przerwanie, wywołując metodę statyczną, stan przerwania jest usuwany. Niestatyczna metoda isInterrupted, używana przez jeden wątek do sprawdzania statusu przerwań innego, nie zmienia flagi statusu przerwania.

Zgodnie z przyjętą konwencją każda metoda, która kończy działanie przez wyrzucenie InterruptedException, kasuje status przerwania, gdy to nastąpi. Jednak zawsze jest możliwe, że status przerwania zostanie natychmiast ponownie ustawiony przez inny wątek wywołujący interrupt.

Wynika z tego, że jest to jawne flag nastawiane tylko poprzez wywołanie interrupt(), niż wywołane przez innych nieznanych zdarzeń zewnętrznych. Jest to dalej wywnioskować z opisu wyjątku w różnych metod, które rzucają go, for example (kopalnia nacisk)

InterruptedException - jeśli nić jest przerwana bieżącego wątku. Przerwany status bieżącego wątku zostanie wyczyszczony po wygenerowaniu tego wyjątku.


Celem systemu przerwania Na ogół w celu zapewnienia wspólnego, dobrze określone ramy dla umożliwienia nici do przerwania czynności (potencjalnie czasochłonne) we pozostałych nitek.Chociaż można wdrożyć podobną funkcjonalność z jawną logiką we własnej aplikacji, mając dobrze zdefiniowany mechanizm umożliwia niezależne klasy (np. JDK, inny kod strony trzeciej, inne niezależne klasy w swoim własnym kodzie), aby zapewnić tę funkcjonalność w spójny sposób .

Wiele notatek i "ostrzeżeń", które widzisz o obsłudze InterruptedException, nie oznacza, że ​​można je rzucić całkowicie spontanicznie, mają one zachęcać do dobrze zaprojektowanych obiektów, które mogą być używane w kontekstach, które nie są jeszcze znane. , gdzie interrupt() będzie działać (tak naprawdę, musisz do chcesz założyć, że mogą być rzucane spontanicznie, jeśli tworzysz obiekty wielokrotnego użytku, które będą solidne w przyszłych sytuacjach - tj. nigdy nie masz gwarancji, że twój kod nie będzie być kiedyś używane przez kogoś, kto oczekuje, że przerywanie zadziała).

Dla szybkich projektów jednorazowych ty nie naprawdę trzeba się martwić o specjalnej obsługi dla tych wyjątków, o ile wiesz na pewno, że nie wzywają interrupt() i nie wzywają coś, co można nazwać interrupt() , ale pamiętaj o konsekwencjach tego na dłuższą metę, szczególnie jeśli w końcu wykorzystasz ten kod w innych kontekstach.