Exchanger兄弟线程间数据信息交换

一、简述

  Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。

二、代码示例

 1 public class ExchangerTest {
 2     
 3     public static void main(String[] args) {
 4         Exchanger<String> exchanger = new Exchanger<>();
 5         ExecutorService executorService = Executors.newFixedThreadPool(2);
 6         String data = "";
 7         executorService.execute(new Procuder(data, exchanger));
 8         executorService.execute(new Consumer(data, exchanger));
 9     }
10 
11 }
12 
13 class Procuder implements Runnable{
14     
15     private String data;
16     private Exchanger<String> exchanger;
17     public Procuder(String data,Exchanger<String> exchanger) {
18         this.data = data;
19         this.exchanger = exchanger;
20     }
21 
22     @Override
23     public void run() {
24         
25         try {
26             for (int i = 0; i < 5; i++) {
27                 data = new Random().nextInt(1000)+"";
28                 System.out.println("producer"+i+" "+data);
29                 Thread.sleep(new Random().nextInt(5)*1000);
30                 exchanger.exchange(data);
31             }
32         } catch (InterruptedException e) {
33             e.printStackTrace();
34         }
35     }
36     
37 }
38 
39 class Consumer implements Runnable{
40     
41     private String data;
42     private Exchanger<String> exchanger;
43     public Consumer(String data,Exchanger<String> exchanger) {
44         this.data = data;
45         this.exchanger = exchanger;
46     }
47 
48     @Override
49     public void run() {
50         
51         try {
52             for (int i = 0; i < 5; i++) {
53                 data = exchanger.exchange(data);
54                 Thread.sleep(new Random().nextInt(5)*1000);
55                 System.out.println("Consumer"+i+" "+data);
56             }
57         } catch (InterruptedException e) {
58             e.printStackTrace();
59         }
60     }
61     
62 }
producer0 360
producer1 782
Consumer0 360
producer2 503
Consumer1 782
producer3 367
Consumer2 503
producer4 151
Consumer3 367
Consumer4 151

 

转载于:https://www.cnblogs.com/shamo89/p/6718286.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值