首页 > 代码库 > java 多线程 29 :多线程组件之 Exchanger
java 多线程 29 :多线程组件之 Exchanger
Exchanger
Exchanger,从名字上理解就是交换。Exchanger用于在两个线程之间进行数据交换,注意也只能在两个线程之间进行数据交换。线程会阻塞在Exchanger的exchange方法上,直到另外一个线程也到了同一个Exchanger的exchange方法时,二者进行数据交换,然后两个线程继续执行自身相关的代码。
Exchanger只有一个exchange方法,用于交换数据。看一下例子:
public static class ExchangerThread extends Thread { private String str; private Exchanger<String> exchanger; private int sleepSecond; public ExchangerThread(String str, Exchanger<String> exchanger, int sleepSecond) { this.str = str; this.exchanger = exchanger; this.sleepSecond = sleepSecond; } public void run() { try { System.out.println(this.getName() + "启动, 原数据为" + str + ", 时间为" + System.currentTimeMillis()); Thread.sleep(sleepSecond * 1000); str = exchanger.exchange(str); System.out.println(this.getName() + "交换了数据, 交换后的数据为" + str + ", 时间为" + System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { Exchanger<String> exchanger = new Exchanger<String>(); ExchangerThread et0 = new ExchangerThread("111", exchanger, 3); ExchangerThread et1 = new ExchangerThread("222", exchanger, 2); et0.start(); et1.start(); }
看一下运行结果:
Thread-0启动, 原数据为111, 时间为1444560972303 Thread-1启动, 原数据为222, 时间为1444560972303 Thread-0交换了数据, 交换后的数据为222, 时间为1444560975303 Thread-1交换了数据, 交换后的数据为111, 时间为1444560975303
看到两个线程交换了数据,由于一个线程睡2秒、一个线程睡3秒,既然要交换数据,肯定是睡2秒的要等待睡3秒的,所以看到时间差是3000ms即3s。
ps:这里感觉是,一个线程需要另一个线程跟他同步的时候 会用到 ,也可用作管道相互通知,先mark
java 多线程 29 :多线程组件之 Exchanger
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。