Exchanger 线程之间数据传输

来源:互联网 发布:nginx 访问不同目录 编辑:程序博客网 时间:2024/06/16 02:36

java Exchanger类用于在线程之间传输数据

class ExchangeOne implements Runnable{    Exchanger<String> exchanger;    public ExchangeOne(Exchanger<String> exchanger){        this.exchanger=exchanger;    }    @Override    public void run() {        try {            String one="one";            System.out.println("thread id:"+Thread.currentThread().getId()+",before value:one,date:"+new Date());            String afterValue=exchanger.exchange(one);            System.out.println("thread id:"+Thread.currentThread().getId()+",after value:"+afterValue+",date:"+new Date());        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

class ExchangeTwo implements Runnable{    Exchanger<String> exchanger;    public ExchangeTwo(Exchanger<String> exchanger){        this.exchanger=exchanger;    }    @Override    public void run() {        try {            Thread.sleep(2000);            String one="two";            System.out.println("thread id:"+Thread.currentThread().getId()+",before value:two,date:"+new Date());            String afterValue=exchanger.exchange(one);            System.out.println("thread id:"+Thread.currentThread().getId()+",after value:"+afterValue+",date:"+new Date());        } catch (InterruptedException e) {            e.printStackTrace();        }    }}


 public static void main(String[] args) {        Exchanger<String> exchanger=new Exchanger<>();        new Thread(new ExchangeOne(exchanger)).start();        new Thread(new ExchangeTwo(exchanger)).start();    }


当ExchangeOne线程调用 exchange方法时,会被阻塞,  直到 ExchangeTwo线程调用 exchange才会继续往下执行


执行结果:

thread id:11,  before value:one,  date:Wed Jul 19 16:07:15 GMT+08:00 2017
thread id:12,  before value:two,  date:Wed Jul 19 16:07:17 GMT+08:00 2017
thread id:12,  after value:one,     date:Wed Jul 19 16:07:17 GMT+08:00 2017
thread id:11,  after value:two,      date:Wed Jul 19 16:07:17 GMT+08:00 2017


thread11第一次运行时 second是 15,交换数据后是 17, 因为 thread12休眠了2秒


原创粉丝点击