Exchanger

Exchanger can be used to sync data bewteen two threads.

import java.util.concurrent.Exchanger;

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

        Runnable task = () -> {
            try {
                String name = Thread.currentThread().getName();
                // send out message and wait for message from others
                String response = exchanger.exchange("hello from " + name);
                System.out.println(name + " received: " + response);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };

        new Thread(task).start();
        new Thread(task).start();
    }
}

Expected output:

Thread-0 received: hello from Thread-1
Thread-1 received: hello from Thread-0