Sunday, September 14, 2014

Exchanger Introduction

Exchanger is a synchronization point in which threads can pair and exchange objects. Exchanger simplifies data exchange between two threads. Exchanger waits till two threads reach the synchronization point and then exchanges the data provided by the threads.

Java Exchanger Class

Java support Exchanger synchronization object. Exchanger is a generic class and support the following key APIs.
  • Exchanger() - Constructor to create the exchanger.
  • public V exchange(V x) - Waits for the partner thread to arrive at the exchange point and then swaps the objects

Java Exchanger Example

In this example, we create in the main() program an Exchanger instance for strings. This Exchanger object is then used to exchange strings between the two threads.

package com.sourcetricks.exchanger;

import java.util.concurrent.Exchanger;

public class ExchangerDemo {

  private static class MyTask1 implements Runnable {

    Exchanger<String> exchanger;
    
    MyTask1(Exchanger<String> exchanger) {
      this.exchanger = exchanger;
    }
    
    @Override
    public void run() {
      String str = null;
      try {
        str = exchanger.exchange("Hello from MyTask1");
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println("Received in MyTask1 = " + str);
    }
    
  }
  
  private static class MyTask2 implements Runnable {

    Exchanger<String> exchanger;
    
    MyTask2(Exchanger<String> exchanger) {
      this.exchanger = exchanger;
    }
    
    @Override
    public void run() {
      String str = null;
      try {
        str = exchanger.exchange("Hello from MyTask2");
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println("Received in MyTask2 = " + str);
    }
    
  }
  
  public static void main(String[] args) {
    
    Exchanger<String> exchanger = new Exchanger<String>();
    
    Thread t1 = new Thread(new MyTask1(exchanger));
    Thread t2 = new Thread(new MyTask2(exchanger));
    t1.start();
    t2.start();
  }
}

This program produces the following output.

Received in MyTask2 = Hello from MyTask1
Received in MyTask1 = Hello from MyTask2

Read other concurrency tutorials from Java Tutorials page.

0 comments :

Post a Comment

Contact Form

Name

Email *

Message *

Back to Top