0

私はスレッドに関するOracle Javaチュートリアルを行っていましたが、この例を見ました

ソース: http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

InterruptedException をスローするメソッドを呼び出さずにスレッドが長時間実行された場合はどうなりますか? 次に、定期的に Thread.interrupted を呼び出す必要があります。これは、割り込みが受信された場合に true を返します。例えば:

for (int i = 0; i < inputs.length; i++) {
      heavyCrunch(inputs[i]);
      if (Thread.interrupted()) {
           // We've been interrupted: no more crunching.
      return;
}

チュートリアルは次のように追加します: 割り込みメカニズムは、割り込みステータスとして知られる内部フラグを使用して実装されます。Thread.interrupt を呼び出すと、このフラグが設定されます。スレッドが静的メソッド Thread.interrupted を呼び出して割り込みをチェックすると、割り込みステータスがクリアされます。あるスレッドが別のスレッドの割り込みステータスを照会するために使用する非静的 isInterrupted メソッドは、割り込みステータス フラグを変更しません。

慣例により、InterruptedException をスローして終了するメソッドは、その時点で割り込みステータスをクリアします。ただし、割り込みを呼び出す別のスレッドによって、割り込みステータスがすぐに再度設定される可能性は常にあります。

今、私は混乱しています。それはいつ起こりますか?割り込みがある場合、スレッドは InterruptedException を受け取るべきではありませんか?

誰かがコードをチェックインするためにこれらの方法を使用するのはいつですか? Thread.interrupt (フラグ) は静的であるため、上記のチェックでは、踏み板のいずれかが中断されているかどうかを実際にチェックします。その場合でも、チュートリアルによると、スレッドが静的メソッド Thread.interrupted を呼び出して割り込みをチェックすると、割り込みステータスがクリアされます。 または、InterruptedException をスローして終了するメソッドは、そのときに割り込みステータスをクリアします。

それで、私は何かが欠けていますか?または、これは、一部のスレッドが割り込みを受信したが、それをチェックしないか、スローしない場合にのみ役立ちますか?

4

3 に答える 3

5

これは Thread.interrupted 実装です

public static boolean interrupted() {
    return currentThread().isInterrupted(true);
}

private native boolean isInterrupted(boolean ClearInterrupted);

ご覧のとおり、現在のスレッドの中断ステータスのみをチェック/リセットできます。静的でない場合は、他のスレッドで呼び出して、API で許可されていないステータスをリセットできます。

于 2013-01-03T04:26:45.640 に答える
2

のすべてのメソッドがThreadをスローするわけではありませんInterrupedException。ほとんどの場合、スリープと待機、または時間のかかるメソッドで一般的です。これは Java が実装した方法です。(sleep(...)nativeコードなので、ソースを表示できません。)

例えば:

try {
    Thread.sleep(1000); // one sec
} catch(InterruptedException e){
}

ただし、句forに単純なループを強制的に含めることはできません。try..catch

をサブクラスThread化する場合は、投稿された規則に従う必要があります。


メソッドに関する 2 番目の質問についてはstatic、内部コードを次に示します。

public static boolean interrupted() {
    return currentThread().isInterrupted(true);
}

ご覧のとおり、現在のスレッドにインスタンスが設定されているだけです。

于 2013-01-03T02:55:43.920 に答える
1

多くの場合、スレッドは多くの待機またはブロックを行っています。これらのほとんどすべてのケースで、ブロッキングを実行しているメソッドは InterruptedException をサポートしています。いくつかの例:

  1. Thread.sleep(ミリ秒);
  2. obj = arrayBlockingQueue.take();
  3. obj.wait();

参照されている記事が指摘しているのは、スレッドがブロックされていない場合、つまり InterruptedException をサポートするメソッドがない場合、スレッドが中断されたかどうかを確認するのはユーザーの責任であるということです。これは、テストによって達成されますThread.interrupted()

メソッドThread.interrupt()は実際には静的ではなく、そのスレッドに割り込むために別のスレッドから呼び出されます。以下を参照してください。

スレッド.割り込み()

それは理にかなっていますか?

于 2013-01-03T03:11:03.110 に答える