java并发编程JUC第十一篇:如何在线程之间进行对等数据交换

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

在下面的代码中java

  • 首先咱们定义了一个Exchanger,用于数据交换
  • 而后定义了两个线程对象bookExchanger1和bookExchanger2,两个线程都持有Exchanger交换器对象用于数据交换
  • 两个线程中的每一个线程都有本身的数据,好比下面代码中的String[] 书籍数组。spring

    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数据分析》

欢迎关注个人博客,里面有不少精品合集

本文转载注明出处(必须带链接,不能只转文字):字母哥博客 - zimug.com数组

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

相关文章
相关标签/搜索