Java高并发中的交换器Exchanger解析
1.Exchanger简介
Exchanger — 交换器,是JDK1.5时引入的一个同步器,从字面上就可以看出,这个类的主要作用是交换数据。
如果两个线程并行处理,但在某个时刻需要互相交换自己已经处理完的中间数据,然后才能继续往下执行。这个时候就可以使用 Exchanger。
Thread1线程到达栅栏后,会首先观察有没其它线程已经到达栅栏,如果没有就会等待,如果已经有其它线程(Thread2)已经到达了,就会以成对的方式交换各自携带的信息,因此Exchanger非常适合用于两个线程之间的数据交换。
2.Exchanger的使用
2.1 常用方法
//实现数据交换,x是交换的数据,V是返回对方线程传递的数据 public V exchange(V x) throws InterruptedException //用于交换,启动交换并等待另一个线程调用exchange,并且设置最大等待时间,当等待时间超过timeout便停止等待。 public V exchange(V x, long timeout, TimeUnit unit)
2.2 使用举例
//数据交换器,用于数据交换 Exchanger<String> exchanger = new Exchanger<>(); //换书线程1 new Thread(()->{ String[] books_A = new String[]{"C++","操作系统"};//图书数组 for (String bookNameA:books_A) { try { //交换数据,bookNameA为我的书,exBook_A为我换回来的书 //System.out.println("线程A准备提交《"+bookNameA+"》书籍,等待交换..."); String exBook_A = exchanger.exchange(bookNameA); System.out.println(Thread.currentThread().getName()+" 用 《"+bookNameA+"》换《"+exBook_A+"》"); } catch (InterruptedException e) { e.printStackTrace(); } } },"线程A").start(); //换书线程2 new Thread(()->{ String[] books_B = new String[]{"Java攻略","并发编程"};//图书数组 for (String bookNameB:books_B) { try { String exBook_B = exchanger.exchange(bookNameB); System.out.println(Thread.currentThread().getName()+" 用 《"+bookNameB+"》换《"+exBook_B+"》"); } catch (InterruptedException e) { e.printStackTrace(); } } },"线程B").start();
- Exchanger 支持多个线程做数据交换;
- 多个线程使用同一个 Exchanger 做数据交换时,结果随机,只要凑满一对,就会进行交换。
到此这篇关于Java高并发中的交换器Exchanger解析的文章就介绍到这了,更多相关Java的Exchanger内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
使用RequestBodyAdvice实现对Http请求非法字符过滤
这篇文章主要介绍了使用RequestBodyAdvice实现对Http请求非法字符过滤的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06Windows系统下Eclipse搭建ESP32编译环境及安装过程
Ecppse 使用了 ESP-IDF 中的 Makefile 支持。这意味着您需要从创建 ESP-IDF 项目开始。您可以使用 github 中的 idf-template 项目,接下来通过本文给大家介绍Windows系统下Eclipse搭建ESP32编译环境及安装过程,感兴趣的朋友一起看看吧2021-10-10解析Spring框架中的XmlBeanDefinitionStoreException异常情况
这篇文章主要介绍了解析Spring框架中的XmlBeanDefinitionStoreException异常情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-04-04
最新评论