Java并发工具类Exchanger的相关知识总结

一、Exchanger的理解

  • Exchanger 属于java.util.concurrent包;
  • Exchanger 是 JDK 1.5 开始提供的一个用于两个工作线程之间交换数据的封装工具类;
  • 一个线程在完成一定的事务后想与另一个线程交换数据,则第一个先拿出数据的线程会一直等待第二个线程,直到第二个线程拿着数据到来时才能彼此交换对应数据。

二、Exchanger类中常用方法

  • public Exchanger() 无参构造方法。表示创建一个新的交换器。
  • public V exchange(V x) 等待另一个线程到达此交换点(除非当前线程为 interrupted ),然后将给定对象传输给它,接收其对象作为回报。

(1)、x :表示可以交换的对象

  • public V exchange(V x, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(除非当前线程为 interrupted或指定的等待时间已过),然后将给定对象传输给它,接收其对象作为回报。

(1)、 x :交换对象
(2)、timeout :等待的最长时间
(3)、unit :timeout参数的时间单位

三、Exchanger类的使用示例

案例场景
模拟客户端和服务端交换数据。

1、代码

package com.xz.thread.Exchanger;

import java.util.concurrent.Exchanger;

/**
 * @description:
 * @author: xz
 * @create: 2021-05-31 21:56
 */
public class Demo {

   //定义一个服务端方法
   public void serverMethod(Exchanger<String> exchanger){
       System.out.println("【服务端】方法开始执行");

       //睡眠1秒钟
       try {
           Thread.sleep(1000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       //定义服务端数据
       String data="serverData";

       //等待另一个线程到达此交换点(除非当前线程为interrupted),然后将给定对象传输给它,接收其对象作为回报。
       String exchangeData="";
       try {
           exchangeData=exchanger.exchange(data);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       System.out.println("服务端原数据="+"serverData,"+" 交换后的数据=" + exchangeData);
   }

    //定义一个客户端方法
    public void clientMethod(Exchanger<String> exchanger){
        System.out.println("【客户端】方法开始执行");

        //睡眠3秒钟
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //定义客户端数据
        String data="clientData";

        //等待另一个线程到达此交换点(除非当前线程为interrupted),然后将给定对象传输给它,接收其对象作为回报。
        String exchangeData="";
        try{
            exchangeData =exchanger.exchange(data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("客户端原数据="+"clientData, "+"交换后的数据=" + exchangeData);

    }

    //测试类
    public static void main(String[] args) {
        Demo d =new Demo();

        //实例化Exchanger
        Exchanger<String> exchanger =new Exchanger();

        //第一个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                d.serverMethod(exchanger);
            }
        }).start();

        //第二个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                d.clientMethod(exchanger);
            }
        }).start();
    }
}

2、运行main函数,输出结果如下:

到此这篇关于Java并发工具类Exchanger的相关知识总结的文章就介绍到这了,更多相关Java工具类Exchanger内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java Exchanger并发类使用方法

    简介 Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的.这里主要是两个线程之间交换持有的对象.当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法. 两个线程都调用exchange方法之后,传入的参数就会交换. 类定义 public class Exchanger<V> 其中V表示需要交换的对象类型. 类继承 java.lang.Object ↳ java.util.concurrent.Excha

  • Java并发编程之Exchanger方法详解

    简介 Exchanger是一个用于线程间数据交换的工具类,它提供一个公共点,在这个公共点,两个线程可以交换彼此的数据. 当一个线程调用exchange方法后将进入等待状态,直到另外一个线程调用exchange方法,双方完成数据交换后继续执行. Exchanger的使用 方法介绍 exchange(V x):阻塞当前线程,直到另外一个线程调用exchange方法或者当前线程被中断. x : 需要交换的对象. exchange(V x, long timeout, TimeUnit unit):阻塞

  • 解析Java并发Exchanger的使用

    类定义 public class Exchanger<V> 其中V表示需要交换的对象类型. 类继承 java.lang.Object java.util.concurrent.Exchanger<V> Exchanger直接继承自Object. 构造函数 Exchanger()  Exchanger提供一个无参构造函数. 两个主要方法 1.public V exchange(V x) throws InterruptedException 当这个方法被调用的时候,当前线程将会等待直

  • Java多线程编程之使用Exchanger数据交换实例

    用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据. 复制代码 代码如下: package com.ljq.test.thread;   import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;   public cla

  • 深入浅析Java常用的格式化Json工具类

    扩展:Java常用工具类汇总 前置条件 导入以下 jar 包 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency> <dependency> <groupId>org.apache.commons</g

  • Java工具类之@RequestMapping注解

    一.前言 问题阐述:在某一场景下,我们的代码在 Service 实现相同,但却在 Controller 层访问时却希望不同的前缀可以访问.如下 :/say/hello.我们这里希望在不借助任何外部服务的情况下 通过 /a/say/hello 和 /b/say/hello 都可以访问到该接口,同时不想在 Controller 中写两个方法. @RestController @RequestMapping("say") public class SayController { @Autow

  • java并发编程工具类JUC之ArrayBlockingQueue

    Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素,并且线程安全的队列.换句话说,当多线程同时从 JavaBlockingQueue中插入元素.获取元素的时候,不会导致任何并发问题(元素被插入多次.处理多次等问题). 从java BlockingQueue可以引申出一个概念:阻塞队列,是指队列本身可以阻塞线程向队列里面插入元素,或者阻塞线程从队列里面获取元素.比如:当一个线程尝试去从一个空队列里面获取元素的时候,这个线

  • 通俗易懂学习java并发工具类-Semaphore,Exchanger

    1. 控制资源并发访问--Semaphore Semaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源. Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法出阻塞等待.当执行完业务功能后,需要通过release()方法将许可证归还,以便其他线程能够获得许可证继续执行. Semaphore可以用于做流量控制,特别是公共资源有限的应用场景,比如数据库连接.假如有多个线程读取

  • Java编程线程同步工具Exchanger的使用实例解析

    本文研究的主要是Java编程线程同步工具Exchanger的使用,下面看看具体内容. 如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到Exchanger这个类,Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只有当每个线程都在进入 exchange ()方法并给出对象时,才能接受其他线程返回时给出的对象. 每次只能两个线程交换数据,如果有多个线程,也只有两个能交换数据.下面看个通俗的例子:一手交钱一首交货! public

  • Java应用EasyExcel工具类

    一.前言 关于EasyExcel,它对poi做了进一步的封装,使得整个编写流程更加的面向对象.好处嘛,我认为流程上更加清晰即易懂.可读性更好,坏处的话,则是操作上没有原生的方式那么灵活. 二.导入 StudentVo为实体类, 注意实体中的各个属性要和excel按顺序一 一对应,建议都用String类型,真正插入时,才去做转换 ImportExcelListener 类为真正处理数据的类 CommonService 只是一个Spring的service bean,用来执行curd操作 priva

随机推荐