zoukankan      html  css  js  c++  java
  • 多线程编程(二)-Exchanger的使用

    • Exchanger的介绍

        类Exchanger的功能可以使两个线程之间传输数据。

    • 方法exchange()的使用

         

    package com.wjg.unit;
    
    import java.util.concurrent.Exchanger;
    
    public class Run {
        public static void main(String[] args) {
            Exchanger<String> exchanger = new Exchanger<String>();
            Run run =new Run();
            ThreadA a = run.new ThreadA(exchanger);
            ThreadB b = run.new ThreadB(exchanger);
            a.start();
            b.start();
        }
        
        public class ThreadA extends Thread{
            
            private Exchanger<String> exchanger;
    
            public ThreadA(Exchanger<String> exchanger) {
                super();
                this.exchanger = exchanger;
            }
    
            @Override
            public void run() {
                try {
                    String receive = exchanger.exchange("123");
                    System.out.println("在线程A中获得线程B的值:"+receive);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        
    public class ThreadB extends Thread{
            
            private Exchanger<String> exchanger;
    
            public ThreadB(Exchanger<String> exchanger) {
                super();
                this.exchanger = exchanger;
            }
    
            @Override
            public void run() {
                try {
                    String receive = exchanger.exchange("456");
                    System.out.println("在线程B中获得线程A的值:"+receive);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    运行结果:
    在线程A中获得线程B的值:456
    在线程B中获得线程A的值:123

    方法exchange(V x,long timeout,TimeUnit unit)的使用

    此方法是指在指定的时间内没有其他线程获取数据,则出现超时异常。

    package com.wjg.unit1;
    
    import java.util.concurrent.Exchanger;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    
    public class Run2 {
        public static void main(String[] args) {
            Exchanger<String> exchanger = new Exchanger<String>();
            Run2 run =new Run2();
            ThreadA a = run.new ThreadA(exchanger);
            a.start();
        }
        
        public class ThreadA extends Thread{
              
            private Exchanger<String> exchanger;
    
            public ThreadA(Exchanger<String> exchanger) {
                super();
                this.exchanger = exchanger;
            }
    
            @Override
            public void run() {
                try {
    //设置超时时间 String receive
    = exchanger.exchange("123",5,TimeUnit.SECONDS); System.out.println("在线程A中获得线程B的值:"+receive); } catch (InterruptedException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } } }

    执行结果:
    java.util.concurrent.TimeoutException
        at java.util.concurrent.Exchanger.exchange(Exchanger.java:683)
        at com.wjg.unit1.Run2$ThreadA.run(Run2.java:27)


  • 相关阅读:
    保存宏的表-TRMAC
    问题解决]Personnel master record xxxx not found (check entry)
    检查员工号是否存在函数[RP_CHECK_PERNR]
    ◆◆0SAP IDOC 开发入门
    IDoc测试工具WE19使用教程
    ◆◆0如何从其他系统导入测试IDOC文件-WE19
    通过message type查找inbound函数-WE57,WE42,
    使用IDOC创建会计凭证[ACC_GL_POSTING01]
    ◆◆0[REUSE_ALV_GRID_DISPLAY_LVC]ALV中字段显示前导零(leading zero)
    不同网段_Pycharm访问服务器
  • 原文地址:https://www.cnblogs.com/niceplay/p/6429959.html
Copyright © 2011-2022 走看看