2013-07-24 4 views
6

でInterruptedExceptionある呼び出しスレッドの睡眠を()を無視することはこれまでも安全です効果的なJavaのJoshua Blochによって公開された例外を決して落とさないという原則と、他の誰かが例外を落としたコードをデバッグしなければならない私自身の豊富な経験でサポートされています。これまでのところ、私はそれが良いアイデアであるケースを発見していない(時にはチェック例外をキャッチし、ランタイムを投げることは議論の余地があるほど妥当だが、私はここでその事例について話しているわけではない)。はいつものJava

コメントありがとうございます。ここで

+0

はキャッチを空白のままに良いオプションであることはありません。まず、コードの誤動作に気付かないでください。この例外が生成されたときに読み込み、例外を予期するコードを記述する。 – logoff

+0

http://stackoverflow.com/q/824110/813951 –

答えて

4

は、この特定の例外についての素晴らしい記事です:コードがすべき

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html

は基本的に、しかし、それは無視すべきではない、非常に少なくとも中断を伝播です:

catch (InterruptedException e) { 
    // Restore the interrupted status 
    Thread.currentThread().interrupt(); 
} 

著者はスレッドのスリープが中断されても気にしません(これは例外を飲み込む正当な理由です)。しかし、スレッドのどこかに割り込みが必要な場合があります。これは、コードを書くときに作者が知らないか考えていたものです:

割り込み要求を処理する予定があるかどうかにかかわらず、単一の割り込み要求が複数の「受信者」を持つ可能性があるためです。標準スレッドプール(ThreadPoolExecutor)ワーカースレッドの実装は割り込みに応答します。したがって、スレッドプール内で実行中のタスクを中断すると、タスクをキャンセルし、スレッドプールがシャットダウンしていることを実行スレッドに通知します。

+0

コードサンプルが例外を伝播しないことが不思議です。 –

+0

私はそのアイデアは、スレッドをスリープ状態にしたいと思っていて、例外処理を心配する必要はないと思っています。それに同意しないか、それを守ること。それについてもっと教育された意見を求めるだけです。私はIBMの記事を読んだ。特に睡眠の場合は扱わない。起こりうる悪いことは、JVMが眠り終わるまで存在できないということです。このコードの作成者はそれで問題ないと思われますが、それが悪化するかどうかは疑問です。ありがとう! – codeotaku

+0

@JBNizetは全く変わっていません。私は例外を伝播することは言及しなかった、私は中断を伝播すると述べた。 – StuPointerException

3

この特定の例では合理的なアプローチではありません。特に、ユーザーがプログラムを終了する場合(たとえば)、JVMはスリープ方法が終了するまでハングしますが、これは不合理なようです。あなたの方法を実行しているスレッドの完全な制御を持っている

  • 、および
  • 例外は無視されます直ちに終了後:

    はIMO、あなたが安全にInterruptedExceptionを無視することができる唯一の状況はどこです。

その他の状況では、次のようにする必要があります。中断したフラグをリセットしてすぐに終了する。

例えば、これは大丈夫のようになります。

//the task is local, nobody else can access it 
final Runnable localRunnable = new Runnable() { 
    public void run() { 
     //catch, ignore and exit immediately 
     try { Thread.sleep(10000); } catch (InterruptedException e) {} 
    } 
} 
//it is your own thread and you have full control over it 
new Thread(localRunnable).start(); 
+0

即時JVM出口をブロックするだけでなく、他に悪い結果が出る可能性はありますか? InterruptedExceptionは本当にとにかく何を通知しますか?それも私には分かりません。ありがとう。 – codeotaku

+0

@codeotaku割り込みは、スレッドが何をやっているのかを尋ねるためにJavaで使用されるメカニズムです。たとえば、スレッドが大きなファイルをダウンロードしていて、そのスレッドを中断した場合は、ダウンロードを停止し、リソースをクリーンアップし(クローズソケットなど)、終了する必要があります。タスクが中断を無視すると、中断を不可能にします。たとえば、中断を無視して非常に不愉快にする第三者の図書館については、今のところ多くの質問があります。そのような状況での唯一の回避策は、コードを独自のプロセスで実行することで、不必要に複雑になる... – assylias

関連する問題