package ar.com.javacuriosities.concurrency.exchanger; import java.util.concurrent.Exchanger; /* * La clase Exchanger se encarga de sincronizar dos threads en un punto, cuando ambos threads llegan a ese punto intercambian un objeto. * Exchanger puede ser visto como una forma bidireccional de un SynchronousQueue. * La clase Exchanger tiene el método exchange() el cual intercambia datos entre threads. * * El problema de Producer/Consumer puede ser implementado con este mecanismo. */ public class Main { public static void main(String[] args) { Exchanger<String> exchanger = new Exchanger<>(); Thread producer = new Thread(new Producer(exchanger)); Thread consumer = new Thread(new Consumer(exchanger)); producer.start(); consumer.start(); } private static final class Producer implements Runnable { private Exchanger<String> exchanger; public Producer(Exchanger<String> exchanger) { this.exchanger = exchanger; } public void run() { String[] messages = { "Hello", "World", "Bye" }; for (String message : messages) { try { // Esperamos el intercambio con el consumidor; exchanger.exchange(message); } catch (InterruptedException e) { // Log and Handle exception e.printStackTrace(); } } } } private static final class Consumer extends Thread { private Exchanger<String> exchanger; public Consumer(Exchanger<String> exchanger) { this.exchanger = exchanger; } public void run() { String message = ""; while (!"Bye".equals(message)) { try { // Espera el intercambio con el productor message = exchanger.exchange(message); System.out.print(message + " "); } catch (InterruptedException e) { // Log and Handle exception e.printStackTrace(); } } } } }