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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
一篇文章了解Jackson注解@JsonFormat及失效解决办法
这篇文章主要给大家介绍了关于如何通过一篇文章了解Jackson注解@JsonFormat及失效解决办法的相关资料,@JsonFormat注解是一个时间格式化注解,用于格式化时间,文中通过代码介绍的非常详细,需要的朋友可以参考下2023-11-11关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明
这篇文章主要介绍了关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-05-05springmvc中RequestMappingHandlerAdapter与HttpMessageConverter的
今天小编就为大家分享一篇关于springmvc中RequestMappingHandlerAdapter与HttpMessageConverter的装配讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-01-01
最新评论