码迷,mamicode.com
首页 > 编程语言 > 详细

并发库应用之十 & 多线程数据交换Exchanger应用

时间:2017-03-09 20:32:10      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:指定   for   code   style   个人   状态   sof   new   div   

  申明:用大白话来说就是用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人会一直等待第二个人,直到第二个人拿着数据到来时,才能彼此交换数据。

  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 = "毒品货物";
15                     System.out.println(String.format("线程毒贩 %s 准备把数据【%s】换出去", Thread.currentThread().getName(), ownData));
16                     String receiveData = (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 = "毛爷爷纸币";
27                     System.out.println(String.format("线程吸毒者 %s 准备把数据【%s】换出去", Thread.currentThread().getName(), ownData));
28                     String receiveData = (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应用

标签:指定   for   code   style   个人   状态   sof   new   div   

原文地址:http://www.cnblogs.com/liang1101/p/6527271.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!