zoukankan      html  css  js  c++  java
  • Exchanger

      Exchanger可以在两个线程之间交换数据,只能是2个线程,不支持更多的线程之间互换数据。

      当线程A调用Exchange对象的exchange()方法后,他会进入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。

      Exchanger很适合于一个生产者和一个消费者的生产者消费者模式。 

    public class ThreadLocalTest {
    
        public static void main(String[] args) {
            Exchanger<List<Integer>> exchanger = new Exchanger<>();
            new Consumer(exchanger).start();
            new Producer(exchanger).start();
        }
    
    }
    
    class Producer extends Thread {
        List<Integer> list = new ArrayList<>();
        Exchanger<List<Integer>> exchanger = null;
        public Producer(Exchanger<List<Integer>> exchanger) {
            super();
            this.exchanger = exchanger;
        }
        @Override
        public void run() {
            Random rand = new Random();
            for(int i=0; i<10; i++) {
                list.clear();
                list.add(rand.nextInt(10000));
                list.add(rand.nextInt(10000));
                list.add(rand.nextInt(10000));
                list.add(rand.nextInt(10000));
                list.add(rand.nextInt(10000));
                try {
                    list = exchanger.exchange(list);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    class Consumer extends Thread {
        List<Integer> list = new ArrayList<>();
        Exchanger<List<Integer>> exchanger = null;
        public Consumer(Exchanger<List<Integer>> exchanger) {
            super();
            this.exchanger = exchanger;
        }
        @Override
        public void run() {
            for(int i=0; i<10; i++) {
                try {
                    list = exchanger.exchange(list);
                } catch (InterruptedException e) {                
          e.printStackTrace(); } System.out.print(list.get(
    0)+", "); System.out.print(list.get(1)+", "); System.out.print(list.get(2)+", "); System.out.print(list.get(3)+", "); System.out.println(list.get(4)+", "); } } }
  • 相关阅读:
    (字符串)子串变位词
    反转链表 II
    翻转链表
    覆盖索引
    MySQL索引结构之Hash索引、full-text全文索引(面)
    MySQL索引结构之B+树索引(面)
    MYSQL 存储引擎(面)
    MySQL架构(面)
    如何在Linux Mint 20系统上安装Pip
    如何在CentOS 8系统服务器上安装Nginx
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/4735319.html
Copyright © 2011-2022 走看看