2011-08-09 6 views
0

私は管理InterruptedExceptionある

try { 
    lockedRecords.wait(); 
} catch (InterruptedException e) { 
    interrupted = true; 
} 

で私のロックuncancelableタスクを作成することを決定したが、資料では、割り込みを呼び出す必要があることを述べている

} finally { 
    if (interrupted) { 
     Thread.currentThread().interrupt(); 
    } 
} 

する必要があるhttp://www.ibm.com/developerworks/java/library/j-jtp05236/index.html

を読んだことがあります()を使用して中断された状態を保持します。私はまだ非常にぼやけているので、もし私が設定すればどうなるのでしょうか?次は何が起こる?これで..少し失われた?

私のプログラムにはどのような価値がありますか? D

+0

この記事では、このメカニズムとそれを処理する方法を理解するのに役立つかもしれません。[InterruptedExceptionで何をしますか?](http://www.yegor256.com/2015/10/20/interrupted-exception.html) ) – yegor256

答えて

2

ここで重要なのは、この例では書かれていないコードです。 例の方法(getNextTaskが)で使用することができる。

while (!Thread.interrupted()) { 
    Task task = getNextTask(queue); 
    doSomething(task); 
} 
System.out.println("The thread was interrupted while processing tasks."); 
System.out.println("...stopped processing."); 

誰かがこのループが実行されるスレッドを中断しない限り、上記whileループが永久に実行します。

誰かがスレッドがgetNextTaskqueue.takeのときにスレッドを中断しようとすると、その後、割り込みが失われ、私は上記の書いたコードのビットを停止することはありません、しかしgetNextTaskに行われているように、割り込みステータスがリセットされない場合ルーピング。

IBM Webページの例の要点は、スレッドを中断することを誤って中断する可能性があるため、割り込みを飲み込む際には非常に注意する必要があるということです。

+0

oicしかし、アプリケーションに割り込みで停止するコードがない場合は、それを心配する必要はありませんか? – seesee

+0

うん...はい、しかし、何らかの点でコードを再利用する可能性があるため、割り込みを設定する方が良いでしょう。なぜなら、スレッドが中断できない理由を理解することが非常に難しいからです。 – toto2

0

ただちにInterruptedExceptionを飲み込んでも、あなたのタスクが完了して返された後に現在のスレッドが終了することがわかっている限り、問題ありません。

ExecutorServiceのようなスレッドプールを使用すると問題が発生することがあります。通常、タスクの完了後にスレッドが実行され続け、次のタスクが来るのを待っています。この場合、プールされたスレッドは、中断されたことを通知されて、この状況で適切なことができるようにする必要があります。クリーンなシャットダウンを実行して終了します。

したがって、ルーチンから戻る前に中断状態を復元することを確認することをお勧めします。

関連する問題