80

JavaのThread.sleepはいつInterruptedExceptionをスローしますか?それを無視するのは安全ですか?私はマルチスレッドを行っていません。私はちょうどいくつかの操作を再試行する前に、数秒待っています。JavaのThread.sleepはいつInterruptedExceptionをスローしますか?

+2

http://stackoverflow.com/questions/1024651/do-i-have-to-worry-about-interruptedexceptions-if-i-dont-interrupt-anything-myse –

+1

「無視する」という意味に依存しますが、 。 'InterruptedException'はキャッチされた例外です。したがって、' Thread'に参加またはスリープするメソッドに対してこのタイプの例外を処理または宣言しない限り、コンパイルできません。また、 'Object'に対して' wait() 'を呼び出します。 – 8bitjunkie

+1

この資料は、このメカニズムを理解するのに役立ちます。[InterruptedExceptionとは何か?](http://www.yegor256.com/2015/10/20/interrupted-exception.html) – yegor256

答えて

24

例外を無視しないでください。

は時々InterruptedExceptionあるが などのRunnableによって定義されたタスクが 割り込みメソッドを呼び出したときなどのオプションではない投げ中断飲み込まない

次の紙を見てみましょう。この場合、 InterruptedExceptionを再発行することはできませんが、何もしたくない場合もあります。 ブロッキングメソッドが割り込みを検出し、InterruptedExceptionをスローすると、 は中断されたステータスをクリアします。 InterruptedException をキャッチして再スローできない場合は、 割り込みが発生していることを示す証拠を保持して、コールスタック上のコードが高い場合に割り込みを知り、必要に応じて応答します。このタスク は、現在の スレッドを「再割り込み」するためにinterrupt()を呼び出すことによって実行されます(リスト3を参照)。少なくとも、 InterruptedExceptionを捕捉して再スローしない場合は、戻る前に現在の スレッドを再割り込みしてください。

public class TaskRunner implements Runnable { 
    private BlockingQueue<Task> queue; 

    public TaskRunner(BlockingQueue<Task> queue) { 
     this.queue = queue; 
    } 

    public void run() { 
     try { 
      while (true) { 
       Task task = queue.take(10, TimeUnit.SECONDS); 
       task.execute(); 
      } 
     } 
     catch (InterruptedException e) { 
      // Restore the interrupted status 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

から、ここで全体の論文を参照してください:

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-

+0

ページが見つかりません。投稿を更新できますか? – Laurence

+1

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs- –

4

シングルスレッドのコードでそれを処理するために、固体と簡単な方法を希望b eをキャッチしてRuntimeExceptionで再試行して、すべてのメソッドに対して宣言する必要がないようにします。

9

Javaスペシャリストのニュースレター(残念ながらお勧めできます)は、interesting article on thisと、InterruptedExceptionの処理方法があります。それは読書と消化の価値があります。

-4

通常、スリープが中断されると、InterruptedExceptionがスローされます。

+11

これは間違っています。なぜなら、それは睡眠そのものではなく、実行中のスレッドであるからです。割り込みはスレッド状態です。それは単に睡眠方法を終了させる。 – ubuntudroid

23

InterruptedExceptionがスローされた場合、何かがそのスレッドを中断(通常は終了)したいことを意味します。これは、スレッドのinterrupt()メソッドの呼び出しによってトリガーされます。 waitメソッドはそれを検出してInterruptedExceptionをスローします。したがって、catchコードは終了要求をすぐに処理でき、指定された時間が経過するまで待つ必要はありません。

シングルスレッドのアプリケーション(およびマルチスレッドのアプリケーションの一部でも)を使用すると、その例外は発生しません。空のcatch節を持つことでそれを無視して、私はお勧めしません。 InterruptedExceptionをスローすると、スレッドの中断状態がクリアされるため、正しく処理されないと情報が失われます。したがって、私は実行するように提案するでしょう:

} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
    // code for stopping current task so thread stops 
} 

この状態を再び設定します。その後、実行を終了します。これは決して使用されることが厳しい、正しい動作になります。良いかもしれない何

は追加することです:catchブロックに

} catch (InterruptedException e) { 
    assert false; 
} 

声明。それは基本的に決して起こらないことを意味します。だから、コードが起こるかもしれない環境でコードが再使用されると、それについて文句を言うでしょう。

+4

Javaのアサーションは[デフォルトではオフ]です(http://stackoverflow.com/a/2758645/1143274)。ですから、 'RuntimeException'を投げる方が良いでしょう。 –

0

Threadsleep()およびwait()のようなメソッドはInterruptedExceptionを投げるかもしれません。これは、待機中またはスリープ中のthreadを中断したい場合に発生します。

関連する問題