Exchangerを使用して2つのスレッド間で通信する

01交換者の役割

2つのスレッド間でデータを転送します。(3つ以上のスレッドではなく2つのスレッドの間に右)

02一般的な方法

exchange() 現在のスレッドをブロックし、他のスレッドがデータをフェッチするのを待ち、他のスレッドがデータをフェッチしない場合は待機します。

exchange() データを渡す

exchange(V v, long timeout, TimeUnit unit) 指定された時間内にメッセージが受信されない場合、タイムアウト例外がスローされます。

03例

package com.page.concurrent.exchanger;

import java.util.concurrent.Exchanger;

public class Worker extends Thread {

    private final String name;
    Exchanger<String> exchanger;

    public Worker(String name, Exchanger<String> exchanger) {
        this.name = name;
        this.exchanger = exchanger;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " : " +
                System.currentTimeMillis() +
                " " + name +
                " waiting message.");

        try {
            String exchange = exchanger.exchange("I'm " + name);
            System.out.println(name + " get message : " + exchange);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

复制代码
package com.page.concurrent.exchanger;

import java.util.concurrent.Exchanger;

public class App {
    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<>();

        for (int i = 1; i <= 2; i++) {
            new Worker("people-" + i, exchanger)
                    .start();
        }
    }
}

复制代码

おすすめ

転載: juejin.im/post/5e95d121e51d4546c55b27cb