zoukankan      html  css  js  c++  java
  • java并发编程JUC第十一篇:如何在线程之间进行对等数据交换

    java.util.concurrent.Exchanger可以用来进行数据交换,或者被称为“数据交换器”。两个线程可以使用Exchanger交换数据,下图用来说明Exchanger的作用

    在下面的代码中

    • 首先我们定义了一个Exchanger,用于数据交换
    • 然后定义了两个线程对象bookExchanger1和bookExchanger2,两个线程都持有Exchanger交换器对象用于数据交换
    • 两个线程中的每个线程都有自己的数据,比如下面代码中的String[] 书籍数组。
    public static void main(String[] args) {
      //数据交换器-数据为book
      Exchanger<String> exchanger = new Exchanger<>();
      //换书线程1
      BookExchanger bookExchanger1
              = new BookExchanger(exchanger, new String[]{"Java从入门到放弃","Java编程思想"});
      //换书线程2
      BookExchanger bookExchanger2
              = new BookExchanger(exchanger, new String[]{"C语言程序设计","实战Python数据分析"});
      
      new Thread(bookExchanger1).start();
      new Thread(bookExchanger2).start();
    }
    

    BookExchanger 继承自Runnable代表参与换书的换书读者,他持有Exchanger数据交换器用于交换图书。

    public class BookExchanger implements Runnable{
    
        Exchanger<String> exchanger = null;  //数据交换器
        String[]  books    = null;   //图书数组
    
        public BookExchanger(Exchanger<String> exchanger, String[] books) {
            this.exchanger = exchanger;
            this.books = books;
        }
    
        @Override
        public void run() {
            try {
                for(String bookName : books) {
                    //交换数据,bookName为我的书,exBook为我换回来的书
                    String exBook = this.exchanger.exchange(bookName);
                    System.out.println(
                            Thread.currentThread().getName() +
                                    " 用《 " + bookName + "》 换 《 " + exBook + "》"
                    );
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    执行上文中的代码,得到如下的打印输出。可以看到只有两个线程完成一次交换之后,才能再进行下一次的交换。

    Thread-1 用《 C语言程序设计》 换 《 Java从入门到放弃》
    Thread-0 用《 Java从入门到放弃》 换 《 C语言程序设计》
    Thread-1 用《 实战Python数据分析》 换 《 Java编程思想》
    Thread-0 用《 Java编程思想》 换 《 实战Python数据分析》
    

    欢迎关注我的博客,里面有很多精品合集

    • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

    觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

  • 相关阅读:
    Redis 设计与实现-内部数据结构
    RuntimeBinderException 异常
    IPv4和IPv6地址库
    -Xms -Xmx -Xmn -Xss -XX:
    倒计时
    列表操作-分片赋值
    20175316毕设准备Day1-2
    20175316毕业设计——基于区块链服务的仓库管理系统
    Python学习笔记:sys.argv入参
    Python学习笔记:bisect模块实现二分搜索
  • 原文地址:https://www.cnblogs.com/zimug/p/14911227.html
Copyright © 2011-2022 走看看