3

キューに何もないときに take() が呼び出されると、正確にはどうなりますか。APIはメソッドが待機すると言っていますが、それはアイテムがキューに入るまでCPUが空/空ではないことをチェックすることを意味しますか、それともスレッドが譲歩して割り込みによって目覚めることを意味しますか? 前者の場合、キューが空であるかどうかを確認し、thread.yield() を呼び出してプロセッサ時間を放棄するかどうかを確認したいと思うでしょう。私の質問は、yield を呼び出す必要があるのか​​、それとも内部メカニズムでそれを処理するのかということです。

第二に、中断された例外は何を意味するのですか? 私が正しく理解している場合、スレッド A がこのメソッドを実行していて入力を待っていて、別のスレッド B が threadA.interrupt() を呼び出した場合、スレッド A は中断された例外をキャッチし、おそらく実行を一時停止します。それはそれについて正しい考え方ですか?

4

3 に答える 3

5

BlockingQueue はインターフェースであることに注意してください。したがって、以下は実装に依存します。(たとえば) LinkedBlockingQueueのソース コードを見ると、 take() のソースは RentrantLock で lockInterruptively() を呼び出します。このためのドキュメントから:

ロックが使用できない場合、現在のスレッドはスレッド スケジューリングの目的で無効になり、次の 2 つのいずれかが発生するまで休止状態になります。

* The lock is acquired by the current thread; or
* Some other thread interrupts the current thread, and interruption of

ロック取得がサポートされています。

何らかのwait()/notify()、または類似のことが起こっているのではないかと思います。CPUを回転させますか?いいえ(経由topまたは同様の方法で確認)

再。割り込みに関するご質問の件ですが、Java Specialist ニュースレターinterrupt()InterruptedException.

記事を読んでください。ただし、基本的に例外をキャッチすると、再中断します。

  try {
        Thread.sleep(1000);
      } catch (InterruptedException ex) {
        Thread.currentThread().interrupt(); // very important
        break;
      }
于 2009-07-14T08:40:57.327 に答える
4

通常、OS サービスを使用してイベント/条件を待機します。これにより、条件/イベントが再度通知されるまでスレッドがスリープ状態になります。待機中はプロセッサー時間は使用されません。

あなたが言ったように、スレッドがwait()呼び出しでブロックされていて、別のスレッドがそのブロックスレッドでinterrupt()を呼び出している場合、通常は割り込み例外が発生します。

于 2009-07-14T07:52:50.870 に答える
0

正常性を保証できないため、yield()を呼び出すことは悪い習慣と見なされます。これを呼び出すと、スケジューラーはノーオペレーションであったため、即座にスレッドに戻ります。代わりに、時間指定の待機(たとえば、wait(1000))を使用してください。

割り込みは、スレッドに何かが必要であることを通知する安全な方法です。処理を停止し、ウェイクアップして何かに応答するなどです。

一般に、これらは具体的なシナリオによって異なります。Javaには、状況により適した並行性に関するいくつかの優れた機能があります。

于 2009-07-14T08:06:49.640 に答える