インタビューブリッツ49:JUCのExchangeスイッチについて話しますか?

Exchange(Exchange)は、その名前が示すように、2つのスレッド間のデータ交換を実現するために使用されます。JDK1.5で生まれました。2つのコアメソッドがあります。

  • exchange(V x):別のスレッドがこの交換ポイントに到達するのを待ってから、オブジェクトを他のスレッドに転送し、交換されたオブジェクトを他のスレッドから取得します。別のスレッドがこのスワップポイントに到達しない場合、スレッドは永久にスリープします(スレッドによって中断されない限り)。
  • exchange(V x、long timeout、TimeUnit unit):別のスレッドがこの交換ポイントに到達するのを待ってから、オブジェクトを他のスレッドに転送し、交換されたオブジェクトを他のスレッドから取得します。別のスレッドがこのスワップポイントに到達しない場合、スレッドはスレッド割り込みが発生するまでスリープするか、設定された時間より長く待機し、その後例外をスローします。

つまり、交換メソッドは交換ポイントであり、スレッドはこの交換ポイントで別のスレッドも交換メソッドを呼び出すまで待機し(この交換ポイントに入るのと同じ)、データを交換してから、後続のスレッドを実行しますコード。

基本的な使用法

Exchangeの基本的な使用法は次のとおりです。「片手での支払いと片手での配達」のシナリオをシミュレートするために2つのスレッドを作成します。スレッド1は最初に交換ポイントに入るお金を準備し、次にスレッド2が準備するのを待ちます。 2秒後に商品(モノ)を交換し、データを交換して次のプロセスを実行します。具体的な実装コードは次のとおりです。

import java.time.LocalDateTime;
import java.util.concurrent.Exchanger;

public class ExchangeExample {
    // 创建一个交互器
    private final static Exchanger<String> exchange = new Exchanger<>();
    public static void main(String[] args) {
        // 线程 1【准备钱】
        new Thread(() -> {
            System.out.println("线程1:准备筹钱中...| Time:" + LocalDateTime.now());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String moeny = "1000 万";
            System.out.println("线程1:钱准备好了【1000 万】。| Time:" + 
                               LocalDateTime.now());
            try {
                // 执行数据交换【交易】
                String result = exchange.exchange(moeny);
                System.out.println("线程1:交易完成,得到【" + result +
                        "】 | Time:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        // 线程 2【准备货】
        new Thread(() -> {
            System.out.println("线程2:准备物品中【西伯利亚新鲜空气】...| Time:" + 
                               LocalDateTime.now());
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String goods = "西伯利亚新鲜空气";
            System.out.println("线程2:物品准备好了【西伯利亚新鲜空气】。| Time:" + 
                               LocalDateTime.now());
            try {
                // 执行数据交换【交易】
                String result = exchange.exchange(goods);
                System.out.println("线程2:交易完成,得到【" + result +
                        "】 | Time:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}
复制代码

上記プログラムの実行結果は以下のとおりです。image.png

要約する

Exchangerは、2つのスレッド間のデータ交換を実現するために使用されます。Exchangerは、作成時に汎用タイプが定義されている限り、任意のデータタイプのデータを交換できます。そのコアメソッドは交換です。スレッドがこのメソッドを実行すると、スリープ状態になり、別のスレッドが交換ポイントに入るのを待ちます。別のスレッドも交換ポイントに入る(そして交換メソッドも実行する)と、2つはデータを交換します。このとき、以降のプロセスを実行します。

何が正しく何が間違っているかを判断し、他の人の話を聞き、利益と損失を数えるのは自分次第です。

公式アカウント:Javaインタビューの質問の分析

インタビューコレクション:gitee.com/mydb/interv…

おすすめ

転載: juejin.im/post/7098968690661523492