Tak, musisz martwić się o InterruptedException
, tak jak musisz martwić się o każdy inny sprawdzony wyjątek, który musisz albo rzucić lub obsługiwać.
W większości przypadków InterruptedException
sygnalizuje żądanie zatrzymania, najprawdopodobniej ze względu na fakt, że wątek, na którym działał twój kod, to interrupted.
W konkretnej sytuacji w puli połączeń oczekujących na wykupienie połączenia, powiedziałbym, że jest to problem z anulowaniem i należy przerwać odbieranie, czyszczenie i przywracanie przerwanej flagi (patrz poniżej).
Jako przykład, jeśli używasz jakiegoś Runnable
/Callable
działa wewnątrz Executor
to trzeba obsłużyć InterruptedException odpowiednio:
executor.execute(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
continue; //blah
}
pingRemoteServer();
}
}
});
Oznaczałoby to, że zadanie nie przestrzega mechanizm przerwania używany przez wykonawcę i nie pozwala na właściwe anulowanie/zamknięcie.
Zamiast właściwego idiomu jest przywrócenie stanu przerwany, a następnie zatrzymać wykonanie:
executor.execute(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // restore interrupted status
break;
}
pingRemoteServer();
}
}
});
Przydatne zasoby:
Absolutnie. Aby uzyskać więcej informacji, zobacz biuletyn Java Specialists http://www.javaspecialists.co.za/archive/Issue056.html –
Nie powinien to być Thread.currentThread(). Interrupt() zamiast Thread.interrupted()? Według javadocs, Thread.interrupted() wyczyści przerwaną flagę, a nie ustawi ją. –
@Joe: masz rację, poprawiłem przykład. Dziękuję Ci. –