ホームページ  >  記事  >  Java  >  Java 並行プログラミングの詳細: wait から java.util.concurrent まで

Java 並行プログラミングの詳細: wait から java.util.concurrent まで

WBOY
WBOYオリジナル
2023-12-20 15:45:58985ブラウズ

Java 並行プログラミングの詳細: wait から java.util.concurrent まで

待機と通知から java.util.concurrent まで: Java 並行プログラミングの高度な方法の探索

Java プログラミングでは、並行性の実装は一般的ですが、非常に難しい作業でもあります. やりがいのある仕事。同時実行性の問題を効果的に解決するために、Java では、synchronized キーワード、wait メソッドと notification メソッド、Thread クラスなど、いくつかの基本的なツールとクラスが提供されています。ただし、アプリケーションが複雑になるにつれて、これらの基本的なツールでは不十分になることがよくあります。同時実行性をより適切に処理するために、Java では java.util.concurrent パッケージも導入されました。これは、より高度な同時プログラミングのメソッドとツールを提供します。この記事では、特定のコード例を示しながら、wait および Notice から java.util.concurrent までのいくつかの高度なメソッドを検討します。

wait と Notice は Object クラスのメソッドであり、スレッド間の通信を実装するために使用されます。 wait メソッドは、他のスレッドが通知メソッドを呼び出してウェイクアップするまで、スレッドを待機状態にします。このメカニズムは、スレッド間の同期を実現するために広く使用されています。以下は簡単な例です。

public class WaitNotifyExample {
    public static void main(String[] args) {
        final Object lock = new Object();

        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread 1 is waiting");
                    lock.wait();
                    System.out.println("Thread 1 is resumed");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread 2 is notifying");
                lock.notify();
            }
        });

        thread1.start();
        thread2.start();
    }
}

上記のコードは 2 つのスレッドを作成します。ここで、thread1 は wait メソッドを呼び出して待機状態に入り、thread2 は Notice メソッドを呼び出して thread1 をウェイクアップします。このようにして、スレッド 1 は実行を継続します。

ただし、この基本的な待機および通知メカニズムは、実際のアプリケーションでは柔軟性や効率性が十分ではないことがよくあります。スレッド プール管理、再入可能ロック、読み取り/書き込みロックなどの複雑な同時実行性の問題は解決できません。これらの問題をより適切に処理するために、Java は java.util.concurrent パッケージを提供します。

このパッケージは、より高度な同時プログラミング手法とツールを提供します。一般的に使用されるクラスとインターフェイスの一部を以下に示します。

  1. Executor インターフェイス: スレッドの実行を管理するための高レベルのツールを定義します。スレッドは、スレッド プールによって提供される実装クラスを使用して作成および管理できます。
Executor executor = Executors.newFixedThreadPool(5);
executor.execute(() -> {
    // 执行任务
});
  1. ロック インターフェイス: 同期型よりも柔軟で再入可能なロック メカニズムを提供します。 ReentrantLock は、Lock インターフェイスの実装です。
Lock lock = new ReentrantLock();
lock.lock();
try {
    // 执行线程安全的操作
} finally {
    lock.unlock();
}
  1. Condition インターフェイス: より正確なスレッド間通信を実現するために、Lock インターフェイスと組み合わせて使用​​されます。待機および通知機能は、await、signal、および signalAll メソッドを通じて実装できます。
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

lock.lock();
try {
    while (!conditionIsMet()) {
        condition.await();
    }
    // 执行逻辑
} finally {
    lock.unlock();
}
  1. CountDownLatch クラス: スレッド実行の待機を制御するために使用されます。カウンタを定義でき、カウンタが 0 になると、待機中のスレッドは実行を継続します。
CountDownLatch latch = new CountDownLatch(3);

Thread thread1 = new Thread(() -> {
    // 执行任务
    latch.countDown();
});

Thread thread2 = new Thread(() -> {
    // 执行任务
    latch.countDown();
});

Thread thread3 = new Thread(() -> {
    // 执行任务
    latch.countDown();
});

latch.await();
// 等待三个线程执行完毕后继续执行
  1. セマフォ クラス: リソースに同時にアクセスするスレッドの数を制御するために使用されます。同時に実行するスレッドの数を一律に制限できます。
Semaphore semaphore = new Semaphore(3);

Thread thread1 = new Thread(() -> {
    try {
        semaphore.acquire();
        // 执行任务
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        semaphore.release();
    }
});

Thread thread2 = new Thread(() -> {
    try {
        semaphore.acquire();
        // 执行任务
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        semaphore.release();
    }
});

// 最多允许3个线程同时执行

これらの高度な方法とツールを使用することで、同時実行の問題をより適切に処理し、アプリケーションのパフォーマンスと信頼性を向上させることができます。ただし、これらの機能を使用する場合は、スレッド セーフと同時実行制御について慎重に考慮する必要があることに注意することが重要です。

要約すると、Java は、基本的な待機メソッドや通知メソッドから、同時プログラミングを処理するためのより高度な java.util.concurrent パッケージに至るまで、高度なメソッドを提供します。実際のニーズと問題の複雑さに基づいて、適切な方法とツールを選択できます。並行プログラミング手法を適切に活用することで、スレッドの実行をより適切に管理し、競合状態やデッドロックを回避し、アプリケーションのパフォーマンスと品質を向上させることができます。

この記事で提供されているサンプル コードとメソッドが、Java 同時プログラミングの学習と実践に役立つことを願っています。

以上がJava 並行プログラミングの詳細: wait から java.util.concurrent までの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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