待機/通知と待機/割り込みの違いは何ですか?

ハイフォン:
synchronized (Foo.class) {
    while (someCondition) {
        try {
            Foo.class.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();            
        }
    }
}

このスレッドは、他のスレッドが呼び出されたとき、interrupt()またはnotify()このスレッドで起動したようです。2つの間に違いはありますか?

-編集-

1つはオブジェクトへの通知用で、もう1つはスレッドへの割り込みです。しかし、これらは両方とも同じ結果につながります。つまり、このスレッドはウェイクアップされます。したがって、私が聞きたいのは、これら2つの状況の結果が互いにどのように異なるかです。

ネイサン・ヒューズ:

あるモニターでスレッドが通知を呼び出すと、そのモニターで待機している単一のスレッドが起動しますがどのスレッドが起動されるかは、スケジューラーによって決定されます。(または、スレッドはnotifyAllを呼び出すことができます。これにより、そのモニターを待機しているすべてのスレッドが起動し、それらすべてがモニターを求めて競合し、敗者は待機に戻ります。そのため、呼び出しのターゲットが異なり、通知が行われます。起動するスレッドを選択するようにスケジューラに指示します。

通知とは異なり、割り込みは特定のスレッドを対象としています。また、割り込みでは、割り込みを受けたスレッドがモニターで待機している必要はありません。スレッドがモニターで待機を呼び出すには、まずそのモニターを取得してから、スレッドが待機を完了するか、割り込みが発生するまで、そのモニターを解放する必要があります。

オラクル社の推奨は、中断はキャンセルのみに使用することです。また、java.util.concurrentのクラスは、キャンセルに割り込みを使用するように設計されています。

この例では、中断はあまり効果的ではありません。制御がwhileループを離れないため、スレッドは待機中の条件をチェックする必要があり、whileループ条件には割り込みフラグが設定されているかどうかのチェックがありません。中断されたスレッドが待機状態に戻る可能性があります。

このコードが中断されると終了するのではなく、待機に戻るのではなく、中断されたフラグのステータスのチェックをループ条件に追加し、catchブロックに中断フラグを設定させます(例外がスローされるとリセットされます)。

synchronized (Foo.class) {
    while (someCondition && !Thread.currentThread().isInterrupted()) {
        try {
            Foo.class.wait();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();            
        }
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

「asyncvoid」(待機なし)と「void」の違いは何ですか

分類Dev

それは、割り込み方が良いでしょう()アイドル状態のスレッドではなく、待機()/通知しますか()?

分類Dev

Selenium WebDriverの暗黙の待機と明示的な待機の違いは何ですか?

分類Dev

タスクの開始と待機の違いは何ですか?

分類Dev

hp-ux ps、スリープと待機の違いは何ですか?

分類Dev

割り込みレイテンシと割り込み応答の違いは何ですか?

分類Dev

待機していないTask.RunとTask.RunSynchronouslyの違いは何ですか

分類Dev

待機ありとなしの返品に違いはありますか

分類Dev

トラップと割り込みの違いは何ですか?

分類Dev

Kotlinコルーチンの起動/参加と非同期/待機の違いは何ですか

分類Dev

非同期/待機に関して、通常のforeach演算子とForEachLINQ演算子の違いは何ですか

分類Dev

待機/通知ありとなしの同期ブロックの違いは?

分類Dev

待機と睡眠の違い

分類Dev

Javaスレッド割り込みは待機、参加、スリープのみ

分類Dev

ForEach内で待機/非同期するための適切な待機とは何ですか?

分類Dev

使用と使用待機の違いは何ですか?そして、どの方法を使用するかをどのように決定できますか?

分類Dev

PythonAsyncioを使用してGPIO割り込みを待機します

分類Dev

async-forとif条件を組み合わせて待機中に中断する正しい方法は何ですか?

分類Dev

これらの非同期/待機コードに違いはありますか?

分類Dev

Rustでの非同期/待機の目的は何ですか?

分類Dev

PrintWriter待機メソッドと通知メソッドは何をしますか?

分類Dev

待機する最善の選択肢は何ですか...低レベルの同期を通知しますか?

分類Dev

Jmeterの「待ち時間」と「接続時間」の違いは何ですか?

分類Dev

プロセスの「待機チャネル」とは何ですか?

分類Dev

プロセスの「待機チャネル」とは何ですか?

分類Dev

Javaスレッドダンプ:「ロック待機」と「待機待機」の違いは?

分類Dev

待ち時間と応答時間の違いは何ですか?

分類Dev

結果を待つ非同期と同期の違いは何ですか?

分類Dev

しばらく(真)と待機()またはスレッドの違いは何であるの参加()

Related 関連記事

  1. 1

    「asyncvoid」(待機なし)と「void」の違いは何ですか

  2. 2

    それは、割り込み方が良いでしょう()アイドル状態のスレッドではなく、待機()/通知しますか()?

  3. 3

    Selenium WebDriverの暗黙の待機と明示的な待機の違いは何ですか?

  4. 4

    タスクの開始と待機の違いは何ですか?

  5. 5

    hp-ux ps、スリープと待機の違いは何ですか?

  6. 6

    割り込みレイテンシと割り込み応答の違いは何ですか?

  7. 7

    待機していないTask.RunとTask.RunSynchronouslyの違いは何ですか

  8. 8

    待機ありとなしの返品に違いはありますか

  9. 9

    トラップと割り込みの違いは何ですか?

  10. 10

    Kotlinコルーチンの起動/参加と非同期/待機の違いは何ですか

  11. 11

    非同期/待機に関して、通常のforeach演算子とForEachLINQ演算子の違いは何ですか

  12. 12

    待機/通知ありとなしの同期ブロックの違いは?

  13. 13

    待機と睡眠の違い

  14. 14

    Javaスレッド割り込みは待機、参加、スリープのみ

  15. 15

    ForEach内で待機/非同期するための適切な待機とは何ですか?

  16. 16

    使用と使用待機の違いは何ですか?そして、どの方法を使用するかをどのように決定できますか?

  17. 17

    PythonAsyncioを使用してGPIO割り込みを待機します

  18. 18

    async-forとif条件を組み合わせて待機中に中断する正しい方法は何ですか?

  19. 19

    これらの非同期/待機コードに違いはありますか?

  20. 20

    Rustでの非同期/待機の目的は何ですか?

  21. 21

    PrintWriter待機メソッドと通知メソッドは何をしますか?

  22. 22

    待機する最善の選択肢は何ですか...低レベルの同期を通知しますか?

  23. 23

    Jmeterの「待ち時間」と「接続時間」の違いは何ですか?

  24. 24

    プロセスの「待機チャネル」とは何ですか?

  25. 25

    プロセスの「待機チャネル」とは何ですか?

  26. 26

    Javaスレッドダンプ:「ロック待機」と「待機待機」の違いは?

  27. 27

    待ち時間と応答時間の違いは何ですか?

  28. 28

    結果を待つ非同期と同期の違いは何ですか?

  29. 29

    しばらく(真)と待機()またはスレッドの違いは何であるの参加()

ホットタグ

アーカイブ