import java.util.concurrent.Exchanger; import java.util.concurrent.TimeUnit; import static java.lang.Thread.currentThread; import static java.util.concurrent.ThreadLocalRandom.current; /** * @desc Exchanger 使用案例 **/ public class ExchangerExample { public static void main(String[] args) { //定义 Exchanger 类,该类是一个“泛型类”,String 类型标明“一对线程交换的数据类型只能是String 类型” final Exchanger<String> exchanger = new Exchanger<>(); // 定义线程 T1 new Thread( ()-> { System.out.println(currentThread() + " start."); try { // 随机休眠 1~ 10 秒钟 randomSleep(); // 执行 exchange() 方法【此方法是阻塞式的】,将对应的数据传递给 T2 线程,同时从 T2 线程获取交换的数据; // data 就是从 T2 线程中返回的数据 String data = exchanger.exchange("I am from T1"); System.out.println(currentThread() + " received:" + data); } catch (InterruptedException e) { e.printStackTrace(); } },"T1").start(); // 定义线程 T2 new Thread( ()-> { System.out.println(currentThread() + " start."); try { // 随机休眠 1~ 10 秒钟 randomSleep(); // 执行 exchange() 方法【此方法是阻塞式的】,将对应的数据传递给 T1 线程,同时从 T1 线程获取交换的数据; // data 就是从 T1 线程中返回的数据 String data = exchanger.exchange("I am from T2"); System.out.println(currentThread() + " received:" + data); } catch (InterruptedException e) { e.printStackTrace(); } },"T2").start(); } private static void randomSleep() { try { TimeUnit.SECONDS.sleep(current().nextInt(10)); } catch (InterruptedException e) { e.printStackTrace(); } } }