Heim >Java >javaLernprogramm >So fangen Sie den InterruptedException-Fehler in Java ab
Catch InterruptedException Error
Bitte überprüfen Sie den folgenden Codeausschnitt:
public class Task implements Runnable { private final BlockingQueue queue = ...; @Override public void run() { while (!Thread.currentThread().isInterrupted()) { String result = getOrDefault(() -> queue.poll(1L, TimeUnit.MINUTES), "default"); //do smth with the result } } T getOrDefault(Callable supplier, T defaultValue) { try { return supplier.call(); } catch (Exception e) { logger.error("Got exception while retrieving value.", e); return defaultValue; } } }
Das Problem mit dem Code besteht darin, dass es nicht möglich ist, den Thread zu beenden, während auf ein neues Element in der Warteschlange gewartet wird, da die Unterbrechungsflagge nie wiederhergestellt wird :
1. Der Thread, der den Code ausführt, ist unterbrochen.
2.BlockingQueue # Die poll()-Methode löst eine InterruptedException aus und löscht das Interrupt-Flag.
3.Die Beurteilung der Schleifenbedingung (!Thread.currentThread().isInterrupted()) in while ist wahr, da die Markierung gelöscht wurde.
Um dieses Verhalten zu verhindern, fangen Sie immer die InterruptedException-Ausnahme ab, wenn eine Methode explizit (indem Sie sie zum Auslösen einer InterruptedException deklarieren) oder implizit (durch Deklarieren/Auslösen einer Rohausnahme) ausgelöst wird, und setzen Sie das Interrupt-Zeichen fort.
T getOrDefault(Callable supplier, T defaultValue) { try { return supplier.call(); } catch (InterruptedException e) { logger.error("Got interrupted while retrieving value.", e); Thread.currentThread().interrupt(); return defaultValue; } catch (Exception e) { logger.error("Got exception while retrieving value.", e); return defaultValue; } }
Das obige ist der detaillierte Inhalt vonSo fangen Sie den InterruptedException-Fehler in Java ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!