zoukankan      html  css  js  c++  java
  • 【java并发核心二】Exchanger的使用

    类 Exchanger 的功能可以使2个线程之间传输数据,比生产者/消费者模式方便。

    Exchanger类的结构很简单,重点就是exchange()方法。

    exchange()方法是阻塞执行的,可以设置超时时间,调用不同的api即可。

    exchange 的 英文意思就是交换,而对于线程而言也是这样的,就是两个线程交换信息。如果共有3个线程,且3个线程同时调用了exchange,那么就会有一个线程没有交换信息的对象,就会继续阻塞。

    下面是一个例子:

    共有两个类 ExchangerThread、ExchangerTest:

    package com.cd.concurrent.exchanger;
    
    import java.util.concurrent.Exchanger;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    
    public class ExchangerThread extends Thread {
        private Exchanger<String> exchanger;
    
        private String name;
    
        public ExchangerThread(String name, Exchanger<String> exchanger) {
            super();
            this.name = name;
            this.exchanger = exchanger;
        }
    
        @Override
        public void run() {
            try {
                //            System.out.println("线程[" + name + "]拿到消息:" + exchanger.exchange(name + "-msg"));  // 不设置超时时间,线程会一直阻塞等待
                System.out.println("线程[" + name + "]拿到消息:" + exchanger.exchange(name + "-msg", 5, TimeUnit.SECONDS)); // 设置5秒的超时时间
                System.out.println("线程[" + name + "]over");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
    package com.cd.concurrent.exchanger;
    
    import java.util.concurrent.Exchanger;
    
    public class ExchangerTest {
    
        public static void main(String[] args) {
            Exchanger<String> exchanger = new Exchanger<String>();
            ExchangerThread t1 = new ExchangerThread("t1", exchanger);
            ExchangerThread t2 = new ExchangerThread("t2", exchanger);
            ExchangerThread t3 = new ExchangerThread("t3", exchanger);
            t1.start();
            t2.start();
            t3.start();
        }
    
    }

    运行结果:

  • 相关阅读:
    python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
    python 全栈开发,Day73(django多表添加,基于对象的跨表查询)
    python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)
    bootstrap源码里的function加上了+号
    php get set方法深入理解
    20160519
    NetStatusEvent info对象的状态或错误情况的属性
    php 代码大全
    常见HTTP状态(304,200等)
    php strtotime 和 date 日期操作
  • 原文地址:https://www.cnblogs.com/klbc/p/9550229.html
Copyright © 2011-2022 走看看