20
May

Exchanger in Java

Exchanges is a kind of rendezvous point where two threads can exchange objects. i.e. Exchanger object simply waits until two separate threads calls exchange method on it. Exchanger object exchanges data supplied by threads. Two threads can pair and swap objects between them.

Example implementation

Step 1: Create a Runnable implementation with Exchanger object passed from executor:
————————————————————————————–
import java.util.concurrent.Exchanger;

public class MyExchangeExecutorRunnable implements Runnable {

private Exchanger exchanger;
Object obj;

MyExchangeExecutorRunnable(Exchanger e, Object o) {
this.exchanger = e;
this.obj = o;
}

@Override
public void run() {
Object previous = this.obj;
try {
this.obj = this.exchanger.exchange(this.obj);
System.out.println(Thread.currentThread().getName() + ” exchanged ” + previous + ” for ” + this.obj);

} catch (InterruptedException e) {
e.printStackTrace();
}

}

}

Step 2: Create an Executor class
———————————-
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyExchangeExecutor {

private static Exchanger ex = new Exchanger();

public static void main(String[] args) {
Map m = new HashMap<>();

Map m1 = new HashMap<>();
m1.put(“A”, “a”);
m1.put(“B”, “b”);
m1.put(“C”, “c”);
m1.put(“D”, “d”);
m1.put(“E”, “e”);

ExecutorService eS = Executors.newFixedThreadPool(2);
eS.submit(new MyExchangeExecutorRunnable(ex, m));
eS.submit(new MyExchangeExecutorRunnable(ex, m1));

eS.shutdown();
eS.shutdownNow();
}
}

Output:
——-

pool-1-thread-2 exchanged {A=a, B=b, C=c, D=d, E=e} for {}
pool-1-thread-1 exchanged {} for {A=a, B=b, C=c, D=d, E=e}