Exchanger的工作原理与实例

先上一个小demo

public class Main {

    public static void main(String[] args) throws InterruptedException {
        Exchanger<String> exchanger=new Exchanger<String>();
        People li=new People("小李家","铁锹",exchanger);
        People gang =new People("小刚家","锤子",exchanger);
        li.start();
        gang.start();

        Thread.sleep(100);
        System.out.println(li.getName()+" has " +li.getTool());
        System.out.println(gang.getName()+" has "+gang.getTool());

    }
    static class People extends Thread{
        private String tool;
        private final Exchanger<String> exchanger;
        public People(String name,String tool,Exchanger<String> exchanger){
            super(name);
            this.tool=tool;
            this.exchanger=exchanger;
        }
        @Override
        public void run() {
            //交换工具
            try {
                tool=exchanger.exchange(tool);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        public String getTool() {
            return tool;
        }
    }


}

输出结果:

首先新建一个People类去继承自Thread,并在main方法里面初始化了两个People,一个起名为小李家,拥有铁锹,另一个起名为小刚家,拥有铁锹,经过exchange之后,两者的tool发生了交换;

在这里面,exchanger对象并不在乎是哪两个线程发生交换,只要有一个线程率先执行到exchange方法,exchanger对象一端就确定为它,之后他将进行阻塞,直到紧接着的一个线程执行到同一个的exchanger的exchange方法,其阻塞状态消除,发生交换,方法的参数是当前线程想要交换出去的item,返回值是想交换进来的item,在一次完整的exchange调用结束后,exchanger之后任然可用,可以再进行下一次交换;

虽然看似要求很多,但是部份你是可以消除的,比如你想实现就是特定几个线程之间的交换,建议是继承Exchanger类并重写exchange方法;想控制交换时延,考虑其exchange重载方法:

exchanger.exchange(String,long,TimeUnit)

至于想控制异常抛出或处理,请移步我的另一篇文章

https://mp.csdn.net/postedit/81512458

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值