您当前的位置: 首页 > 

Dongguo丶

暂无认证

  • 1浏览

    0关注

    472博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JUC工具类Exchanger

Dongguo丶 发布时间:2021-09-19 13:59:09 ,浏览量:1

Exchanger 概念

线程可以在成对内配对和交换元素的同步点。每个线程在输入exchange方法时提供一些对象,与合作者线程匹配,并在返回时接收其合作伙伴的对象。交换器可以被视为一个的双向形式SynchronousQueue。交换器在诸如遗传算法和管道设计的应用中可能是有用的。

一个用于两个工作线程之间交换数据的封装工具类,简单说就是一个线程在完成一定的事务后想与另一个线程交换数据,则第一个先拿出数据的线程会一直等待第二个线程,直到第二个线程拿着数据到来时才能彼此交换对应数据。

img

用法

Exchanger 泛型类型,其中 V 表示可交换的数据类型

  • V exchange(V v):等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
  • V exchange(V v, long timeout, TimeUnit unit):等待另一个线程到达此交换点(除非当前线程被中断或超出了指定的等待时间),然后将给定的对象传送给该线程,并接收该线程的对象。

案例

package com.dongguo.juc;

import java.util.Random;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author Dongguo
 * @date 2021/9/19 0019-11:34
 * @description:
 */
public class ExchangerDemo {
    public static void main(String[] args) {
        Exchanger exchanger = new Exchanger();
        ExecutorService executor = Executors.newCachedThreadPool();
        //模拟两个线程组
        for (int i = 1; i  {
                try {
                    int num = new Random().nextInt(10);
                    System.out.println(Thread.currentThread().getName() + "开始交换数据:" + num);
                    num = exchanger.exchange(num);//交换数据并得到交换后的数据
                    System.out.println(Thread.currentThread().getName() + "交换数据结束后的数据:" + num);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }


        executor.shutdown();
    }
}
运行结果:
pool-1-thread-2开始交换数据:9
pool-1-thread-1开始交换数据:8
pool-1-thread-2交换数据结束后的数据:8
pool-1-thread-1交换数据结束后的数据:9
关注
打赏
1638062488
查看更多评论
立即登录/注册

微信扫码登录

0.0369s