Exchanger :
Exchanger is introduced in jdk1.5 with classes like CountDownLatch,CyclicBarrier and Semaphores.
This class is used to exchange data between two threads. An Exchanger waits until both the threads call its exchange() method and when this method is invoked, the exchanger exchanges data between two threads. It uses method exchange for exchanging data .
It has two version of exchange method given below :
- V exchange(V x): This method will wait until other thread calls exchange method or interrupts it. When other thread calls exchange method then waiting thread resumed and data exchanging is done between two threads.
- V exchange(V x, long timeout, TimeUnit unit) : This method will wait until other thread calls exchange method or interrupts it or specified time elapses. . When other thread calls exchange method then waiting thread resumed and data exchanging is done between two threads.
Example to demonstrate Exchanger :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import java.util.concurrent.Exchanger; class ProducerBuffer implements Runnable { Exchanger<String> exchanger; String message; ProducerBuffer(Exchanger<String> exchanger) { message = new String(); this.exchanger = exchanger; } @Override public void run() { for (int i = 0; i < 10; i++) { message += i; System.out.println("Producer produced message: " + message); try { message = exchanger.exchange(message); } catch (InterruptedException e) { e.printStackTrace(); } } } } class ConsumerBuffer extends Thread { ProducerBuffer prod; Exchanger<String> exchanger; String message; ConsumerBuffer(Exchanger<String> exchanger) { this.exchanger = exchanger; } public void run() { for (int i = 0; i < 10; i++) { try { message = exchanger.exchange(new String()); System.out.println("Consumer consumed message: " + message); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class ExchangerDemo { public static void main(String[] args) { Exchanger<String> exchanger = new Exchanger<String>(); ProducerBuffer prodBuffer = new ProducerBuffer(exchanger); ConsumerBuffer consBuffer = new ConsumerBuffer(exchanger); Thread prodThread = new Thread(prodBuffer, "prodThread"); Thread consThread = new Thread(consBuffer, "consThread"); prodThread.start(); consThread.start(); } } |
OutPut:
Producer produced message: 0
Producer produced message: 1
Consumer consumed message: 0
Consumer consumed message: 1
Producer produced message: 2
Consumer consumed message: 2
Producer produced message: 3
Consumer consumed message: 3
Producer produced message: 4
Consumer consumed message: 4
Producer produced message: 5
Consumer consumed message: 5
Producer produced message: 6
Consumer consumed message: 6
Producer produced message: 7
Consumer consumed message: 7
Producer produced message: 8
Consumer consumed message: 8
Producer produced message: 9
Consumer consumed message: 9
Real Time usecase:
Exchanger is mainly used which implements Producer consumer problem as booth threads exchange data between each other
Leave a Reply