Javaマルチスレッド通信方式の解析

WBOY
リリース: 2024-04-12 08:18:01
オリジナル
322 人が閲覧しました

Java では、マルチスレッド通信メソッドには、共有変数、待機/通知、セマフォ、パイプが含まれます。共有変数はデータ交換を容易にしますが、同時実行性の問題が発生しやすくなります。待機/通知は同期メカニズムを使用してスレッド間で待機およびウェイクアップします。セマフォはリソースに同時にアクセスするスレッドの数を制限します。パイプはバッファを使用してスレッド間でデータを転送します。

Javaマルチスレッド通信方式の解析

#Java マルチスレッド通信方式の分析

はじめに

マルチスレッドスレッド化は並行性です。複数のタスクを同時に実行できるようにする、プログラミングにおける重要な概念です。マルチスレッド環境でデータ交換を実装するには、さまざまな通信方法を理解する必要があります。この記事では、共有変数、待機/通知、セマフォ、パイプなど、Java の一般的なマルチスレッド通信メソッドについて詳しく説明します。

共有変数

共有変数は、複数のスレッドからアクセスできるグローバル変数です。 1 つのスレッドが共有変数を変更すると、他のスレッドはその変更を確認できます。ただし、共有変数は、競合状態や予測不可能な動作などの同時実行性の問題が発生する傾向があります。

実際のケース:

public class SharedVariableExample {
    private static int sharedCounter = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                sharedCounter++;
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                sharedCounter--;
            }
        });

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

        thread1.join();
        thread2.join();

        System.out.println("最终共享计数器:" + sharedCounter);
    }
}
ログイン後にコピー

wait/notify

wait/notify は、Java に組み込まれた同期メカニズムです。 wait() メソッドは、他のスレッドが Notify() または NotifyAll() メソッドを呼び出してウェイクアップするまで、現在のスレッドを待機状態にします。

実際的なケース:

public class WaitNotifyExample {
    private static Object lock = new Object();

    private static boolean dataAvailable = false;

    public static void main(String[] args) throws InterruptedException {
        Thread producer = new Thread(() -> {
            synchronized (lock) {
                while (!dataAvailable) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                System.out.println("处理数据...");
            }
        });

        Thread consumer = new Thread(() -> {
            synchronized (lock) {
                dataAvailable = true;
                lock.notify();
            }
        });

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

        producer.join();
        consumer.join();
    }
}
ログイン後にコピー

セマフォ

セマフォは、特定の数のスレッドを許可する同期メカニズムです。同時にリソースも。スレッドがセマフォを取得すると、セマフォ カウンタはデクリメントされ、セマフォを解放すると、カウンタはインクリメントされます。

実際のケース:

public class SemaphoreExample {
    private static Semaphore semaphore = new Semaphore(2);

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("线程 1 进入临界区");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        });

        Thread thread2 = new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("线程 2 进入临界区");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        });

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

        thread1.join();
        thread2.join();
    }
}
ログイン後にコピー

パイプライン

パイプラインは、スレッド間の通信に使用される特別なデータ構造です。これはバッファのようなもので、1 つのスレッドがデータを書き込み、別のスレッドがデータを読み取ることができます。

実際的なケース:

public class PipeExample {
    private static PipedOutputStream pos = new PipedOutputStream();
    private static PipedInputStream pis = new PipedInputStream(pos);

    public static void main(String[] args) throws IOException {
        Thread writer = new Thread(() -> {
            try {
                pos.write("你好,世界!".getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                pos.close();
            }
        });

        Thread reader = new Thread(() -> {
            try {
                byte[] data = new byte[1024];
                int length = pis.read(data);
                System.out.println(new String(data, 0, length));
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                pis.close();
            }
        });

        writer.start();
        reader.start();

        writer.join();
        reader.join();
    }
}
ログイン後にコピー

以上がJavaマルチスレッド通信方式の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート