Exchanger

Exchanger,从名字上理解就是交换。Exchanger用于在两个线程之间进行数据交换,注意也只能在两个线程之间进行数据交换。线程会阻塞在Exchanger的exchange方法上,直到另外一个线程也到了同一个Exchanger的exchange方法时,二者进行数据交换,然后两个线程继续执行自身相关的代码。

Exchanger只有一个exchange方法,用于交换数据。看一下例子:

public static class ExchangerThread extends Thread
{
private String str;
private Exchanger<String> exchanger;
private int sleepSecond; public ExchangerThread(String str, Exchanger<String> exchanger, int sleepSecond)
{
this.str = str;
this.exchanger = exchanger;
this.sleepSecond = sleepSecond;
} public void run()
{
try
{
System.out.println(this.getName() + "启动, 原数据为" + str + ", 时间为" + System.currentTimeMillis());
Thread.sleep(sleepSecond * 1000);
str = exchanger.exchange(str);
System.out.println(this.getName() + "交换了数据, 交换后的数据为" + str + ", 时间为" + System.currentTimeMillis());
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
} public static void main(String[] args)
{
Exchanger<String> exchanger = new Exchanger<String>();
ExchangerThread et0 = new ExchangerThread("111", exchanger, 3);
ExchangerThread et1 = new ExchangerThread("222", exchanger, 2);
et0.start();
et1.start();
}

看一下运行结果:

Thread-0启动, 原数据为111, 时间为1444560972303
Thread-1启动, 原数据为222, 时间为1444560972303
Thread-0交换了数据, 交换后的数据为222, 时间为1444560975303
Thread-1交换了数据, 交换后的数据为111, 时间为1444560975303

看到两个线程交换了数据,由于一个线程睡2秒、一个线程睡3秒,既然要交换数据,肯定是睡2秒的要等待睡3秒的,所以看到时间差是3000ms即3s。


ps:这里感觉是,一个线程需要另一个线程跟他同步的时候  会用到 ,也可用作管道相互通知,先mark

最新文章

  1. VS2012 单元测试之泛型类(Generics Unit Test)
  2. Android drawable微技巧
  3. 如何在Outlook中打开后缀 .eml 的附件
  4. 【java基础学习】泛型
  5. 架设laravel
  6. Android DiskLruCache 硬盘缓存
  7. Wifi-Direct
  8. smartGit30天试用过期
  9. 三方贸易-drop ship
  10. C#中linq
  11. Cookie和Seesion的区别
  12. 查看本机IP地址及子网掩码(netmask)
  13. Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现
  14. 【Tomcat】项目自动部署的链接重置错误
  15. redis在java项目中的使用
  16. c++头
  17. 当Erlang遇到Solr
  18. 地图开发GIS的应用有哪些?
  19. SQLServer 索引总结
  20. Xamarin.Forms 开发资源集合(复制)

热门文章

  1. magento 为用户注册增加一个字段(转)
  2. Android MD5校验码的生成与算法实现
  3. WebService出错 Maximum message size quota for incoming messages (65536) has been exceeded.已超过传入消息(65536)的最大消息大小配额
  4. Java后端,应该日常翻看的中文技术网站
  5. Eclipse的数据库插件
  6. sqlserver 在尝试加载程序集 ID 65537 时 Microsoft .NET Framework 出错.服务器可能资源不足
  7. process credentials(二)
  8. 分布式配置 tachyon 并执行Hadoop样例 MapReduce
  9. ios标准开发者账号 ios企业开发者账号的区别总结
  10. MFC带标题栏的窗口和不带标题栏的窗口最大化