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 ]换回来的数据[ 香蕉 ]

 

posted @ 2017-08-21 21:18  半生戎马,共话桑麻、  阅读(83)  评论(0)    收藏  举报
levels of contents