先上一个小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)
至于想控制异常抛出或处理,请移步我的另一篇文章