Edit:
Po jakimś tam iz powrotem, wydaje się, że chcesz być w stanie przerwać procedury IO. Wydaje się to dobrą robotą dla niektórych klas NIO InterrutibleChannel
. Na przykład odczytywanie BufferedReader
jest przerywalne i spowoduje wyświetlenie InterruptedIOException
. Zobacz tutaj dla more examples of the NIO code.
BufferedReader in = new BufferedReader(new InputStreamReader(
Channels.newInputStream((new FileInputStream(
new File(...))).getChannel())));
Następnie można nazwać future.cancel()
który powoduje przerwanie nici i powodują, że IO rzucić InterruptedIOException
. Jeśli tak się stanie, możesz nie złapać IOException
i niech wypływa z metody call()
.
Jeśli chcesz przejść z powrotem do Future
że metoda call()
został przerwany to myślę rzucanie InterruptedException
jest w porządku. Inną opcją będzie po prostu return null;
lub inny obiekt znacznikowy z metody call()
. Zwykle robię to, gdy wątek został przerwany.
Jedną rzeczą do zapamiętania jest to, że jeśli call()
rzuca InterruptedException
, kiedy wykonujesz future.get()
będzie rzucać ExecutionException
i przyczyną tego wyjątku ma być InterruptedException
. Nie należy mylić tego, że future.get()
może sam wyrzucić samą siebie, jeśli zostanie przekroczony limit czasu wynoszący .
try {
result = future.get();
} catch (ExecutionException e) {
if (e.getCause() instanceof InterruptedException) {
// call() method was interrupted
}
} catch (InterruptedException e) {
// get was interrupted
}
Jeśli jednak future.cancel(true)
nazwano wówczas future.get()
rzuci CancellationException
zamiast.
Jedynym prawdziwym źródłem do wyjaśnienia wyjątku "InterruptedException" jest [tutaj] (http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html). –
Przeczytałem to wcześniej, ale nie wspomniano o możliwości wywołania. Ale bardzo dobry artykuł. –