8

Callable で Thread.interrupted() を処理する適切な方法は何ですか? callable は InterruptedException をスローする必要があると思います。例えば:

public class MyCallable implements Callable<Object> {
    public Object call() {
        Object result = null;

        // Simulate long-running operation that calculates result
        while (true) {
            ...
            if (Thread.interrupted()) {
                throw new InterruptedException();
            }
        }

        result = ... // something produced by the long-running operation    

        return result;
    }
}

これは正しいですか、それともより適切な処理方法がありますか? ありがとう。

4

2 に答える 2

7

編集

何度か行ったり来たりした後、IO ルーチンを中断できるようにしたいようです。InterrutibleChannelこれは、一部の NIOクラスにとっては良い仕事のようです。たとえば、次からの読み取りBufferedReaderは中断可能であり、 をスローしInterruptedIOExceptionます。NIO コードのその他の例については、こちらを参照してください。

BufferedReader in = new BufferedReader(new InputStreamReader(
    Channels.newInputStream((new FileInputStream(
        new File(...))).getChannel())));

次に、 which を呼び出しfuture.cancel()てスレッドを中断し、IO にInterruptedIOException. その場合、 をキャッチできIOException、メソッドから少しずつ出てきcall()ます。


Futureメソッドが中断されたことを に戻したい場合は、call()スローしても問題ないと思いますInterruptedException。別のオプションは、代わりにメソッドreturn null;からのマーカーオブジェクトだけ、または他のマーカーオブジェクトにすることです。call()これは通常、スレッドが中断された場合に私が行うことです。

覚えておくべきことの 1 つは、 if call()throwsInterruptedExceptionを実行するfuture.get()と a がスローされ、その例外ExecutionException原因InterruptedExceptionは. タイムアウトした場合、それ自体future.get()もスローされる可能性があるので混乱しないでください。InterruptedExceptionget(long timeout, TimeUnit unit)

 try {
     result = future.get();
 } catch (ExecutionException e) {
     if (e.getCause() instanceof InterruptedException) {
        // call() method was interrupted
     }
 } catch (InterruptedException e) {
     // get was interrupted
 }

ただし、future.cancel(true)が呼び出された場合future.get()は、代わりに がスローされCancellationExceptionます。

于 2012-10-09T17:40:36.517 に答える
1

実際には、スレッドをどのように待機させるかによって異なりますget()。待機中のスレッドに例外をスローさせたくない場合は、したくありませthrow new InterruptedException

想像

try{
  future.get();
}catch(ExecutionException ex){

}catch(InterruptedException em){

}

例外が発生した場合、それは何だと思いますか? あなたの場合、それはExecutionExceptionです。が必要ない場合はExecutionException、InterruptedException を再スローしないでください。

于 2012-10-09T17:46:32.877 に答える