Java高并发中的交换器Exchanger解析
作者:safe_u
这篇文章主要介绍了Java高并发中的交换器Exchanger解析,如果两个线程并行处理,但在某个时刻需要互相交换自己已经处理完的中间数据,然后才能继续往下执行,这个时候就可以使用 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!