2013-04-15 7 views
9

Thread.interruptは、sleep,joinおよびwaitのようなコールを中断します。どのように正確に実装されているのだろうか。Javaで割り込みがどのように知っていますか?

私は知っているThread.interruptは、フラグisInterruptedを設定します。 waitはこのフラグをポーリングするだけですか?私はそれがしないことを望む。だから私の質問はどのようにwait "割り込み"について知っている。

+1

Javaソースを探索しようとしましたか? – Ankit

+0

システム割り込み – BlackJoker

+3

'wait()'はネイティブメソッドです:-)ソースはありません – sanbhat

答えて

2

wait()はポーリングしません。 interrupt()は中断されたスレッドの状態をチェックします。実行されている場合は、フラグを設定するだけです。それがwait()sleep()、またはjoin()である場合、中断するスレッドはそれをプロセッサにキューイングします。中断されたスレッドが実行を再開すると、まずフラグをチェックし、フラグがオンの場合はInterruptedExceptionをスローします。

+0

ありがとうございます。 'interrupt'は他のブロッキング呼び出しと同じように動作しますか? 'Process.waitFor'? – Michael

+0

はい - 対応するjavadocを参照してください。割り込みI/O操作が機能しない可能性があります(その他のスタックオーバーフローに関する質問を参照してください)。 –

+0

ありがとうございます。それがどの程度正確に実装されているか教えてください。 – Michael

0

これは、システムがJVMではなくスレッドを処理しているため、OSの懸案事項です。各OSは異なる方法でスレッドを扱います。

+0

です。私はLinuxでpthreadsがどのように実装されているのだろうか? – Michael

+1

@マイケル、それは最終的にOSシンクロコールイベント、コンドルアまたはセマフォになる。このような呼び出しは、呼び出しスレッドを準備完了状態から外し、CPUへのディスパッチには使用できません。スレッドは、実行を受け付けない「死んだ」コードになります。通知や割り込みやスリープの終了などの別のスレッドからの信号は、スレッドを再び準備し、CPUコアが使用可能になると実行します。 –

1

待ち時間と結合は、中断されたフラグをチェックしません。後でsleep()を呼び出すスレッドに割り込んだ場合は中断されますが、wait()またはjoin()を呼び出すと何も起こりません。

+0

Javadocは次のように言っています:_このスレッドは、Objectクラスのwait()、wait(long)、またはwait(long、int)メソッドの呼び出し、またはjoin()、join(long)、join long、int)、sleep(long)、またはsleep(long、int)のメソッドであれば、その割り込みステータスはクリアされ、InterruptedExceptionを受け取る。 – Michael

+0

はい、 - それはありません。 –

+0

誤解して申し訳ありません。今私はそれが実際にどのように実装されているのだろうか。 – Michael

関連する問題