17-Java5的Exchanger同步工具
package cn.itcast.demo.thread; import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExchangerTest { public static void main(String[] args) { // 创建线程池 ExecutorService executorService = Executors.newCachedThreadPool(); // 创建数据交换的线程对象 final Exchanger<String> exchanger = new Exchanger<String>(); // 创建一个线程 executorService.execute(new Runnable() { @Override public void run() { String data1 = "苹果"; System.out.println("线程[ " + Thread.currentThread().getName() + " ]准备把[ " + data1 + " ]换出去"); try { Thread.sleep(2000L+(long)Math.random()*10000); // 休息完之后不执行下面的代码,等到另外一个线程也休息完之后才会一起执行 String data2 = exchanger.exchange(data1); System.out.println("线程[ " + Thread.currentThread().getName() + " ]换回来的数据[ " + data2 + " ]"); } catch (Exception e) { e.printStackTrace(); } } }); // 创建另一个线程 executorService.execute(new Runnable() { @Override public void run() { String data1 = "香蕉"; System.out.println("线程[ " + Thread.currentThread().getName() + " ]准备把[ " + data1 + " ]换出去"); try { Thread.sleep(3000L+(long)Math.random()*10000); // 休息完之后不执行下面的代码,等到另外一个线程也休息完之后才会一起执行 String data2 = exchanger.exchange(data1); System.out.println("线程[ " + Thread.currentThread().getName() + " ]换回来的数据[ " + data2 + " ]"); } catch (Exception e) { e.printStackTrace(); } } }); executorService.shutdown(); } }
输出:
线程[ pool-1-thread-1 ]准备把[ 苹果 ]换出去 线程[ pool-1-thread-2 ]准备把[ 香蕉 ]换出去 线程[ pool-1-thread-2 ]换回来的数据[ 苹果 ] 线程[ pool-1-thread-1 ]换回来的数据[ 香蕉 ]