java并发编程系列之Exchanger的使用

我们在看香港的警匪片的时候,经常会有这种画面,毒贩和贩毒的人,会先约定某个地点,然后进行一手交钱一手交白粉的勾当,其实这种场景使用jdk1.5并发包中的Exchanger类也可以实现,下面我们就用一个简单的示例,来模拟下这种场景,示例代码如下:

public class ExchangeDemo {
	public static void main(String[] args) {
		// 新建一个Exchanger
		final Exchanger exchanger = new Exchanger();
		// 新建一个线程,该线程持有资源为白粉
		ExecutorService service = Executors.newFixedThreadPool(1);
		service.execute(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println(Thread.currentThread().getName()+"我有白粉,准备交换钱……");
					Thread.sleep(5000);
					/*
					 *  在此处等待另外一个线程到来,并进行数据交换,如果没有另一个线程到来,那么当前这个线程会处于休眠状态,直到3件事情发生:
					 *  1、等待另一个线程到达交换点
					 *  2、被另一个线程中断(警察赶来了,打断了交易)
					 *  3、等待超时,当调用exchanger.exchange(x, timeout, unit)方法时有效(毒贩查觉到危险,没有来交易)
					 */
					String result = exchanger.exchange("白粉");
			System.out.println(Thread.currentThread().getName()+"换回来的为:"+" "+result+" 原来为白粉!");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		// 新建一个线程,该线程持有资源为钱
		ExecutorService service1 = Executors.newFixedThreadPool(1);
		service1.execute(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println(Thread.currentThread().getName()+"我有钱,准备交换白粉");
					Thread.sleep(2000);
					String result = exchanger.exchange("钱");
					System.out.println(Thread.currentThread().getName()+"换回来的为:"+" "+result+" 原来为钱!");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		// 释放线程资源
		service.shutdown();
		service1.shutdown();
	}
}

测试结果如下:

ool-1-thread-1我有白粉,准备交换钱……
pool-2-thread-1我有钱,准备交换白粉
pool-2-thread-1换回来的为: 白粉 原来为钱!
pool-1-thread-1换回来的为: 钱 原来为白粉!

注意事项:只适用于2个线程之间的信息交换

你可能感兴趣的:(java,线程池,concurrent)