2016-04-05 4 views
0

あなたは中断が発生したことを知っている発信者が必要ですが、あなたができない場合、私はあなたがスレッドを再度中断あなたはInterruptedExceptionsをキャッチ状況に興味を持っていますが、例の下どのような状況で割り込みステータスを保持していますか?

try{ 
    //Some code 
    } catch (InterruptedException ie) { 
     // (Re-)Cancel if current thread also interrupted 
     pool.shutdownNow(); 
     // Preserve interrupt status 
     Thread.currentThread().interrupt(); 
    } 
+1

何かする必要があるときは? – Guy

答えて

0

を割り込みステータス・..likeを保存しますメソッドの署名を変更して、メソッドthrows InterruptedExceptionを宣言します。例えば

あなたがjava.lang.Runnableを実装している場合、あなたはチェック例外を追加するメソッドのシグネチャを変更することはできません:あなたはRunnable実装でInterruptedExceptionをスロー何かをするのであれば

interface Runnable { 
    void run(); 
} 

を、そしてあなた

class SleepingRunnable implements Runnable { 
    @Override public void run() { 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     Thread.currentThread().interrupt(); 
    } 
    } 
} 

あなたのメソッドのシグネチャを変更することができるならば、それを行う方が良いです:あなたは、そのスレッドに中断フラグを設定する必要があり、それを処理するためのクラスを呼び出すできるように、それを処理することはできませんそう:InterruptedExceptionがチェックされた例外であるため、呼び出し元はそれを処理することを余儀なくされます。これにより、スレッドがよりはっきりと中断される可能性があります。

+0

これは良い一般的な説明ですが、あなたの例はあまり良くありません。 runメソッドの場合は、スレッドが中断されたことを気にすることはありません(メソッドが返されると状態はクリアされます)。 – jtahlborn

+0

@jtahlbornあなたは一般的にそのことを知らない。 'Runnable.run()'はどこでも*実行できます。あなたが言うことは、それがスレッドまたは標準実行プログラムの実装によって実行されている場合にのみ当てはまります。 –

+0

技術的には正しいですが、スレッドやエグゼキュータではなく、Runnableで実行する頻度はどれくらいですか? – jtahlborn

関連する問題