「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > wait()、notify()、およびnotifyAll()メソッドはどのクラスに属しますか?

wait()、notify()、およびnotifyAll()メソッドはどのクラスに属しますか?

2024 年 11 月 1 日に公開
ブラウズ:922

Which Class Do the wait(), notify(), and notifyAll() Methods Belong To?

1. wait()、notify()、およびnotifyAll()メソッドを理解する

wait()notify()、および notifyAll() メソッドは Java の同時実行モデルに不可欠です。これらは、Java のクラス階層のルートである Object クラスに属します。これは、Java のすべてのクラスが Object クラスからこれらのメソッドを継承することを意味します。

1.1 オブジェクトクラス

Object クラスは、Java のすべてのクラスのスーパークラスです。 toString()equals()hashCode() など、すべてのクラスが継承する基本メソッドのセットを提供します。 wait()notify()、および notifyAll() メソッドもこのクラスの一部であり、スレッドが通信してアクティビティを調整できるようにします。

1.2 wait()、notify()、およびnotifyAll()の役割

  • wait(): このメソッドにより、別のスレッドが同じオブジェクトに対して notify() または notifyAll() を呼び出すまで、現在のスレッドが待機します。同期されたブロックまたはメソッド内から呼び出す必要があります。
  • notify(): このメソッドは、オブジェクトのモニター (スレッドのロック) で待機している単一のスレッドを起動します。複数のスレッドが待機している場合は、そのうちの 1 つが任意に選択されます。
  • notifyAll(): このメソッドは、オブジェクトのモニターで待機しているすべてのスレッドを起動します。これは、複数のスレッドに状態の変化を通知する必要がある場合に便利です。

2. wait()、notify()、notifyAll() の実際の使用

これらのメソッドがどのように機能するかを理解するために、いくつかの実践的な例を見てみましょう。

2.1 コード例

これらのメソッドの使用法を示す簡単な例を次に示します:


class SharedResource {
    private boolean available = false;

    public synchronized void consume() throws InterruptedException {
        while (!available) {
            wait(); // Wait until the resource is available
        }
        // Consume the resource
        System.out.println("Resource consumed.");
        available = false;
        notify(); // Notify that the resource is now unavailable
    }

    public synchronized void produce() {
        // Produce the resource
        available = true;
        System.out.println("Resource produced.");
        notify(); // Notify that the resource is available
    }
}

public class Main {
    public static void main(String[] args) {
        SharedResource resource = new SharedResource();

        Thread producer = new Thread(() -> {
            try {
                while (true) {
                    Thread.sleep(1000); // Simulate time to produce
                    resource.produce();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread consumer = new Thread(() -> {
            try {
                while (true) {
                    resource.consume();
                    Thread.sleep(2000); // Simulate time to consume
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producer.start();
        consumer.start();
    }
}


2.2 デモの結果

上記の例では:

  • プロデューサー スレッドは定期的にリソースを生成し、コンシューマーに通知します。
  • コンシューマ スレッドは、リソースが利用可能になるまで待機し、それを消費して、必要に応じてプロデューサに通知します。

プロデューサーとコンシューマーの操作を示す次の出力が表示されます:


Resource produced.
Resource consumed.
...


この出力は、wait()notify()、および notifyAll() がプロデューサーとコンシューマーの対話をどのように調整するかを示しています。

3.結論

wait()notify()、および notifyAll() メソッドがどのクラスに属し、どのように機能するかを理解することで、効果的に管理できます。 Java アプリケーションのスレッド間通信。これらのメソッドは、スレッドが連携してリソースを効率的に共有するために不可欠です。

ご質問がある場合、またはさらに詳しい説明が必要な場合は、お気軽に以下にコメントを残してください。

投稿の詳細はで読む: wait()、notify()、およびnotifyAll()メソッドはどのクラスに属しますか?

リリースステートメント この記事は次の場所に転載されています: https://dev.to/anh_trntun_4732cf3d299/what-c​​lass-do-the-wait-notify-and-notifyall-methods-belong-to-58bp?1 侵害がある場合は、study_golang にご連絡ください。 @163.com 削除
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3