Prawidłowym domyślnym wyborem jest dodanie InterruptedException do listy rzutów. Przerwanie wskazuje, że inny wątek chce, aby Twój koniec się zakończył. Powód tego żądania nie jest oczywisty i jest całkowicie kontekstowy, więc jeśli nie posiadasz żadnej dodatkowej wiedzy, powinieneś założyć, że jest to tylko przyjazne zamknięcie, a wszystko, co pozwala uniknąć tego zamknięcia, jest nieprzyjazną odpowiedzią.
Java nie wyrzuci losowo wyjątków InterruptedException, wszystkie porady nie wpłyną na twoją aplikację, ale natknąłem się na przypadek, w którym deweloper przestrzegający strategii „połknięcia” stał się bardzo niewygodny. Zespół opracował duży zestaw testów i bardzo często korzystał z Thread. Teraz zaczęliśmy przeprowadzać testy na naszym serwerze CI, a czasem z powodu wad w kodzie utknęliśmy w ciągłym oczekiwaniu. Co gorsza, przy próbie anulowania zadania CI nigdy się nie zamykało, ponieważ Przerwanie Wątku, które miało przerwać test, nie przerywa zadania. Musieliśmy zalogować się do skrzynki i ręcznie zabić procesy.
Krótko mówiąc, jeśli po prostu rzucisz InterruptedException, pasujesz do domyślnej intencji, że twój wątek powinien się zakończyć. Jeśli nie możesz dodać InterruptedException do swojej listy rzutów, zawinię go w RuntimeException.
Istnieje bardzo racjonalny argument, że InterruptedException powinien być samym RuntimeException, ponieważ zachęcałoby to do lepszej „domyślnej” obsługi. To nie jest RuntimeException tylko dlatego, że projektanci trzymali się kategorycznej reguły, że RuntimeException powinien reprezentować błąd w kodzie. Ponieważ wyjątek InterruptedException nie powstaje bezpośrednio z błędu w kodzie, nie jest nim. Ale w rzeczywistości często pojawia się wyjątek InterruptedException, ponieważ w kodzie jest błąd (tj. Nieskończona pętla, dead-lock), a Interrupt jest metodą innego wątku, która radzi sobie z tym błędem.
Jeśli wiesz, że należy zrobić racjonalne porządki, zrób to. Jeśli znasz głębszą przyczynę Przerwania, możesz podjąć bardziej kompleksową obsługę.
Podsumowując, wybory do obsługi powinny być następujące:
- Domyślnie dodaj do rzutów.
- Jeśli nie możesz dodawać do rzutów, wyrzuć RuntimeException (e). (Najlepszy wybór spośród wielu złych opcji)
- Tylko wtedy, gdy znasz wyraźną przyczynę Przerwania, postępuj zgodnie z potrzebami. Jeśli twoja obsługa jest lokalna dla twojej metody, zresetuj przerwane przez wywołanie Thread.currentThread (). Interrupt ().