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

13 篇文章 0 订阅
8 篇文章 0 订阅

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

public class ExchangeDemo {
	public static void main(String[] args) {
		// 新建一个Exchanger
		final Exchanger<String> exchanger = new Exchanger<String>();
		// 新建一个线程,该线程持有资源为白粉
		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个线程之间的信息交换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值