java 多线程 29 :多线程组件之 Exchanger
2024-09-04 06:02:08
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
最新文章
- VS2012 单元测试之泛型类(Generics Unit Test)
- Android drawable微技巧
- 如何在Outlook中打开后缀 .eml 的附件
- 【java基础学习】泛型
- 架设laravel
- Android DiskLruCache 硬盘缓存
- Wifi-Direct
- smartGit30天试用过期
- 三方贸易-drop ship
- C#中linq
- Cookie和Seesion的区别
- 查看本机IP地址及子网掩码(netmask)
- Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现
- 【Tomcat】项目自动部署的链接重置错误
- redis在java项目中的使用
- c++头
- 当Erlang遇到Solr
- 地图开发GIS的应用有哪些?
- SQLServer 索引总结
- Xamarin.Forms 开发资源集合(复制)
热门文章
- magento 为用户注册增加一个字段(转)
- Android MD5校验码的生成与算法实现
- WebService出错 Maximum message size quota for incoming messages (65536) has been exceeded.已超过传入消息(65536)的最大消息大小配额
- Java后端,应该日常翻看的中文技术网站
- Eclipse的数据库插件
- sqlserver 在尝试加载程序集 ID 65537 时 Microsoft .NET Framework 出错.服务器可能资源不足
- process credentials(二)
- 分布式配置 tachyon 并执行Hadoop样例 MapReduce
- ios标准开发者账号 ios企业开发者账号的区别总结
- MFC带标题栏的窗口和不带标题栏的窗口最大化