首页 > 代码库 > 并发库应用之十 & 多线程数据交换Exchanger应用
并发库应用之十 & 多线程数据交换Exchanger应用
申明:用大白话来说就是用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人会一直等待第二个人,直到第二个人拿着数据到来时,才能彼此交换数据。
java.util.concurrent.Exchanger<V> V 表示可以交换的对象类型
对应构造方法摘要:
Exchanger() 创建一个新的 Exchanger
方法摘要:
V exchange(V v) 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象
V exchange(V v, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的
对象传送给该线程,同时接收该线程的对象
案例应用:
好比两个毒贩要进行交易,一手交钱、一手交货,不管谁先来到接头地点后,就处于等待状态了,当另外一方也到达了接头地点(所谓到达接头地点,也就是到到达了准备接头的状态)时,两者的数据就立即交换了,然后就又可以各忙各的了。我们用代码来实现这个例子:
1 import java.util.concurrent.Exchanger; 2 import java.util.concurrent.ExecutorService; 3 import java.util.concurrent.Executors; 4 5 public class ExchangerTest { 6 7 public static void main(String[] args) { 8 ExecutorService service = Executors.newCachedThreadPool(); 9 final Exchanger exchanger = new Exchanger(); 10 service.execute(new Runnable() { 11 public void run() { 12 try { 13 Thread.sleep((long) (Math.random() * 5000)); 14 String ownData = "http://www.mamicode.com/毒品货物"; 15 System.out.println(String.format("线程毒贩 %s 准备把数据【%s】换出去", Thread.currentThread().getName(), ownData)); 16 String receiveData =http://www.mamicode.com/ (String) exchanger.exchange(ownData); 17 System.out.println(String.format("线程毒贩 %s 换回的数据是【%s】", Thread.currentThread().getName(), receiveData)); 18 } catch (Exception e) {} 19 } 20 }); 21 22 service.execute(new Runnable() { 23 public void run() { 24 try { 25 Thread.sleep((long) (Math.random() * 5000)); 26 String ownData = "http://www.mamicode.com/毛爷爷纸币"; 27 System.out.println(String.format("线程吸毒者 %s 准备把数据【%s】换出去", Thread.currentThread().getName(), ownData)); 28 String receiveData =http://www.mamicode.com/ (String) exchanger.exchange(ownData); 29 System.out.println(String.format("线程吸毒者 %s 换回的数据是【%s】", Thread.currentThread().getName(), receiveData)); 30 } catch (Exception e) {} 31 } 32 }); 33 } 34 }
以上代码运行结果打印效果如下:
并发库应用之十 & 多线程数据交换Exchanger应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。