ホームページ  >  記事  >  Java  >  Java マルチスレッド プログラミング: スレッドの作成、同期、通信

Java マルチスレッド プログラミング: スレッドの作成、同期、通信

WBOY
WBOYオリジナル
2023-05-11 19:51:191586ブラウズ

Java マルチスレッド プログラミング: スレッドの作成、同期、通信

オブジェクト指向プログラミング言語として、Java はマルチスレッド プログラミングをサポートし、複雑なマルチタスクの同時実行の問題を処理できます。 Java のマルチスレッド プログラミングでは、プログラムを複数の実行スレッドに分解してタスクを同時に実行することで、プログラムのパフォーマンスを大幅に向上させることができます。

Java では、スレッドはメモリやその他のリソースを他のスレッドと共有する軽量の実行パスです。各スレッドは独自のタスクを独立して実行しますが、スレッドは同期と通信を通じてリソースを調整し、共有できます。

スレッドの作成
Java でスレッドを作成するには、Thread クラスを継承する方法と Runnable インターフェイスを実装する方法の 2 つがあります。

public class MyThread extends Thread {
    public void run() {
        System.out.println("MyThread is running.");
    }
}

Thread クラス メソッドの継承:

public class MyRunnable implements Runnable{
    public void run(){
        System.out.println("MyRunnable is running.");
    }
}

Runnable インターフェイス メソッドの実装:

// 继承Thread类方式
Thread thread1 = new MyThread();
thread1.start();

// 实现Runnable接口方式
Thread thread2 = new Thread(new MyRunnable());
thread2.start();

スレッド起動メソッドは次のとおりです:

public class MyCounter {
    private int count;

    public synchronized void increment() {
        count++;
    }
}

スレッド同期
Java の場合 マルチスレッドプログラミングでは、スレッド間の実行順序が予測できないため、複数のスレッドが同時に共有リソースにアクセスすると、データ競合の問題が発生し、不正なプログラム結果が発生する可能性があります。

スレッド間の正しい調整とデータ共有を確実にするために、Java には同期メカニズムとオブジェクト ロックが提供されています。同期メカニズムは synchronized キーワードを通じて実装され、ロック メカニズムは Java の lock オブジェクトを通じて実装されます。

以下は、synchronized キーワードの使用方法です。

public class MyCounter {
    private int count;
    private final Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
}

上記のコードでは、increment() メソッドはスレッドセーフなメソッドです。このメソッドでは、1 つのスレッドが同時にアクセスできます。

ロック オブジェクトの使用方法は次のとおりです:

public class MyQueue {
    private Queue<String> queue = new LinkedList<>();

    public synchronized void put(String value) {
        queue.add(value);
        notify();
    }

    public synchronized String get() throws InterruptedException {
        while (queue.isEmpty()) {
            wait();
        }
        return queue.remove();
    }
}

上記のコードでは、increment() メソッドもスレッドセーフ メソッドです。スレッドの安全性を確保するには、最初に渡す必要があります##lock()メソッドはオブジェクト ロックを取得し、操作の完了後にオブジェクト ロックを解放します。

スレッド通信

スレッドの安全性はスレッド同期メカニズムによって確保できますが、場合によってはスレッド間の調整と情報交換が必要となり、その場合にはスレッド通信メカニズムが必要になります。スレッド通信メカニズムには、wait()、notify()、notifyAll() の 3 つのメソッドが含まれています。

wait() メソッドは、別のスレッドが Notify() メソッドを使用して通知するか、wait() タイムアウトになるまで、現在のスレッドを待機させ、スレッドのステータスを待機状態に設定します。

notify() メソッドは、待機状態のスレッドをウェイクアップします。待機状態のスレッドが複数ある場合、ウェイクアップするスレッドはランダムに 1 つだけ選択されます。

notifyAll() メソッドは、待機状態にあるすべてのスレッドを起動して、待機状態にある複数のスレッドを同時に実行できるようにします。

以下はスレッド通信の例です:

rrreee

上記のコードでは、

put() メソッドは要素をキューに追加し、notify( ) メソッドは待機中のスレッドに通知します。get() メソッドはキュー内の要素を待ち、要素が追加されたときに notify() メソッドを使用して待機中のスレッドに通知します。利用可能です。

結論

Java でのマルチスレッド プログラミングは複雑なタスクであり、プログラムの正確さとパフォーマンスを確保するには慎重な設計と実装が必要です。スレッドの作成、同期、および通信メカニズムを理解すると、Java でのマルチスレッド プログラミングの核心を習得し、それによってプログラムの品質とパフォーマンスを向上させることができます。

以上がJava マルチスレッド プログラミング: スレッドの作成、同期、通信の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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