ホームページ  >  記事  >  Java  >  wait()、notify()、およびnotifyAll()メソッドはどのクラスに属しますか?

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-06 11:27:30432ブラウズ

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()、および NoticeAll() メソッドはどのクラスに属しますか?

以上がwait()、notify()、およびnotifyAll()メソッドはどのクラスに属しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:jUnit - Java の単体テスト次の記事:なし