2016-05-27 4 views
1

私はスレッドの概念が初めてです。 run()内の現在のスレッドを中断しようとしていました。Java:forループは、現在のスレッドの中断後でも1回実行されます

基本的には、2回の睡眠で5回(forループで)単語を印刷しようとしていました。ループが2回目に実行される前にスレッドを中断しようとすると、2回目にワードが表示されます。次へループする前に一度だけ、割り込みが呼び出されたとして印刷する

word 
word 
sleep interrupted 

は、私は言葉を期待していた:私は、コードをコンパイルして実行すると

public void run() 
{ 
try{ 
for(int i=0;i<=5;i++){ 
//print word 
System.out.println(word); 
//sleep 
    Thread.sleep(2000); 
//interrupt 
    Thread.currentThread().interrupt(); 

} 
} catch(InterruptedException e){ 
System.out.println("sleep interrupted"); 
} 
} 

しかし、私は次のような結果を得ますforループのインスタンス第二の単語とInterruptedExceptionある同時に投げます「睡眠が中断」なぜ私は私が言葉第二の時間を印刷せずに「睡眠が中断され、」スローへの割り込み期待していた。..

を理解していません。

ありがとうございます!

+2

中断されたフラグはチェックしません。割り込みは何もしません。 _next time_あなたが 'sleep'を呼び出すと、フラグがチェックされ、例外が送出されます。 –

+0

@BoristheSpiderのコメントを拡張する:目的の動作を得るためには、外部ソース(別のスレッド)からスレッドを中断する必要があります。 – Turing85

+0

@ Turing85外部ソースからの割り込みは、*すぐには中断しません。他のスレッドが 'interrupt()'を呼び出すときにスレッドが現在 'i ++'を実行していれば、それと同じ動作をします。 – Andreas

答えて

4

interrupt()のjavadocを読む:このスレッドがブロックされている場合、このスレッドがブロックされている場合、このスレッドがブロックされている場合は、[[...] [...]

を...]

このスレッドの割り込みステータスは、に設定されています。

interrupt()を呼び出した時点でスレッドがブロックされていないため、例外をスローせずにステータスを設定するだけです。

sleep()メソッドは割り込みステータスを検出し、例外をスローします。

+0

私にそれを説明してくれてありがとう!心から感謝する.. –

0
  • 初めてプリントワードは
  • は2秒に眠る
  • 割り込みが二回目の印刷単語が
  • 睡眠への呼び出しが何をしたいInterruptedExceptionある

をスローが

  • です()と呼ばれます
    for(int i = 0; i <= 5 && !Thread.currentThread().isInterrupted(); i++){ 
    
  • +0

    私にそれを説明してくれてありがとう!本当に助けてくれてありがとう。 –

    0

    Thread.currentThread().interrupt()を呼び出すと、スレッドの割り込みフラグが設定されます。スレッドの割り込みフラグは、上位レベルの割り込みハンドラで適切に使用できます。通常、catchブロック内でInterruptedException、つまり。をキャッチして呼び出し元に割り込みが発生したことを知らせるとき、これを使用します。

    しかし、ここではforループを終了するために使用します。そして、あなたが2度目にThread.Sleep()を入力すると、プログラムによってフラグセットが実現されます。手動でそれを読むためには、

    が理由この

    for(int i=0;i<=5 && !Thread.currentThread().isInterrupted();i++) 
    
    +1

    [簡潔さは受け入れられるが、より完全な説明が良い。] – Turing85

    +0

    そこに行く。すべて良い。 –

    +0

    私にそれを説明してくれてありがとう!本当に助けていただきありがとうございます。 –

    0

    をお試しくださいinterrupt()を呼び出すときに、あなたが実際にあなたのスレッドを中断されていないということです。

    したがって、ステータスが割り込みに設定されている場合は、割り込み後にその例外が第2のでトリガされます。この状態では、あなたは寝ることができませんので、例外が発生します。

    +0

    私にそれを説明してくれてありがとう!本当に助けていただきありがとうございます。 –

    関連する問題