Mechanizm przerwania wątku jest preferowanym sposobem uzyskania (współpracującego) wątku, aby odpowiedział na żądanie zatrzymania tego, co robi. Każdy wątek (w tym myślę, że sam wątek) mógłby wywołać interrupt()wątek.
W praktyce normalne przypadki użycia interrupt()obejmują pewien rodzaj frameworka lub menedżera, który nakazuje wątkowi robocemu przerwanie tego, co robią. Jeśli wątek roboczy jest „świadomy przerwania”, zauważy, że został przerwany przez wyjątek lub przez okresowe sprawdzanie flagi przerwania. Zauważając, że został przerwany, grzeczny wątek porzuciłby to, co robi i zakończył się sam.
Zakładając powyższy przypadek użycia, twój kod prawdopodobnie zostanie przerwany, jeśli zostanie uruchomiony w środowisku Java lub z jakiegoś wątku roboczego. A kiedy zostanie przerwany, twój kod powinien porzucić to, co robi i doprowadzić do końca w najbardziej odpowiedni sposób. W zależności od tego, jak został wywołany Twój kod, można to zrobić, zwracając lub zgłaszając odpowiedni wyjątek. Ale chyba nie powinien dzwonić System.exit(). (Twoja aplikacja niekoniecznie wie, dlaczego została przerwana, a na pewno nie wie, czy istnieją inne wątki, które muszą zostać przerwane przez framework).
Z drugiej strony, jeśli twój kod nie jest przeznaczony do uruchamiania pod kontrolą jakiegoś frameworka, możesz argumentować, że InterruptedExceptionjest to nieoczekiwany wyjątek; tj. błąd. W takim przypadku wyjątek należy traktować tak, jak inne błędy; np. zawiń go w niesprawdzony wyjątek i złap go i zarejestruj w tym samym miejscu, w którym masz do czynienia z innymi nieoczekiwanymi, niezaznaczonymi wyjątkami. (Alternatywnie, Twoja aplikacja może po prostu zignorować przerwanie i kontynuować to, co robiła).
1) Jeśli sam nigdy nie przerywam innych wątków, co może wywołać wyjątek InterruptedException?
Jednym z przykładów jest sytuacja, w której Runnableobiekty są wykonywane przy użyciu ExecutorServicei shutdownNow()jest wywoływana w usłudze. Teoretycznie każda pula wątków lub platforma zarządzania wątkami innej firmy może legalnie zrobić coś takiego.
2) Jeśli sam nigdy nie przerywam innych wątków, używając przerwania () ... co oznacza InterruptedExceptionthen? Co mam zrobić po złapaniu jednego? Czy zamknąć moją aplikację?
Musisz przeanalizować kod źródłowy, aby dowiedzieć się, co interrupt()wywołuje połączenia i dlaczego. Gdy już to ustalisz, możesz dowiedzieć się, co musi zrobić >> Twoja << część aplikacji.
Dopóki nie wiesz, dlaczego InterruptedExceptionjest rzucany, radziłbym potraktować to jako poważny błąd; np. wydrukuj stos do pliku dziennika i zamknij aplikację. (Oczywiście nie zawsze jest to właściwa odpowiedź ... ale chodzi o to, że jest to „błąd”, na który należy zwrócić uwagę programisty / opiekuna).
3) Jak mogę się dowiedzieć, kto / co dzwoni interrupt()?
Nie ma na to dobrej odpowiedzi. Najlepsze, co mogę zasugerować, to ustawić punkt przerwania Thread.interrupt()i spojrzeć na stos wywołań.