Java并发之Exchanger类

应用场景

如果两个线程在运行过程中需要交换彼此的信息,可以使用Exchanger这个类。
Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只有当每个线程都在进入 exchange ()方法并给出对象时,才能接受其他线程返回时给出的对象。

使用方法

Exchanger的构造方法如下:
  • Exchanger(); //创建一个新的 Exchanger。
Exchanger用到的主要方法有:
  • exchange(V x); //等待另一个线程到达此交换点(除非它被中断),然后将给定的对象传送给该线程,并接收该线程的对象。

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

实例代码

package Exchanger;

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

public class Exechanger {
    public static void main(String[] args) {
        ExecutorService exec=Executors.newCachedThreadPool();
        Exchanger<String> exchanger=new Exchanger<>();
        new Thread() {
            @Override
            public void run() {
                String data1="data1";
                try {
                    System.out.println(Thread.currentThread().getName()+"交换前的数据:"+data1);
                    String data2=exchanger.exchange(data1);
                    System.out.println(Thread.currentThread().getName()+"交换后的数据:"+data2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        new Thread() {
            @Override
            public void run() {
                String data2="data2";
                try {
                    System.out.println(Thread.currentThread().getName()+"交换前的数据:"+data2);
                    String data1=exchanger.exchange(data2);
                    System.out.println(Thread.currentThread().getName()+"交换后的数据:"+data1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值