相关文章:
Exchanger,即交换器,是一个同步工具类,用于控制两个线程在同步点处的数据交换
Exchanger 提供了一个同步点 (调用 exchange()
方法的地方即为同步点),当一个线程先执行到达同步点后,会被阻塞,直到另一个线程也进入到同步点为止,当两个线程都到达该同步点后,就会进行数据交换
-
举例说明 1
-
ExchangerTest.java
public class ExchangerTest { public static void main(String[] args) { Exchanger<String> exchanger = new Exchanger<>(); new Thread(new Boy(exchanger)).start(); new Thread(new Girl(exchanger)).start(); // 女生慢慢地从教室里走出来... // 男生说:【我其实暗恋你很久了...】 // 女生说:【我很喜欢你...】 } } class Boy implements Runnable { private Exchanger<String> exchanger; public Boy(Exchanger<String> exchanger) { this.exchanger = exchanger; } @Override public void run() { try { System.out.println("女生慢慢地从教室里走出来..."); TimeUnit.SECONDS.sleep(2); // 男生对女生说的话 String boy = exchanger.exchange("我很喜欢你..."); System.out.println("男生说:【" + boy +"】"); } catch (InterruptedException e) { e.printStackTrace(); } } } class Girl implements Runnable { private Exchanger<String> exchanger; public Girl(Exchanger<String> exchanger) { this.exchanger = exchanger; } @Override public void run() { try { // 女生对男生说的话 String girl = exchanger.exchange("我其实暗恋你很久了..."); System.out.println("女生说:【" + girl +"】"); } catch (Exception e) { e.printStackTrace(); } } }
- 如上所示,调用
exchange()
方法会阻塞当前线程,使其进入同步点,当另一个线程也调用exchange()
方法到达同步点后,两者就会进行数据交换
- 如上所示,调用
-
-
举例说明 2
-
ExchangerTest.java
public class ExchangerTest { public static void main(String[] args) { Exchanger<String> exchanger = new Exchanger<>(); new Thread(new Boy(exchanger)).start(); new Thread(new Girl(exchanger)).start(); // 女生慢慢地从教室里走出来... // java.util.concurrent.TimeoutException // at java.util.concurrent.Exchanger.exchange(Exchanger.java:626) // at com.xj.current.tool.Girl.run(ExchangerTest.java:55) // at java.lang.Thread.run(Thread.java:748) } } class Boy implements Runnable { private Exchanger<String> exchanger; public Boy(Exchanger<String> exchanger) { this.exchanger = exchanger; } @Override public void run() { try { System.out.println("女生慢慢地从教室里走出来..."); TimeUnit.SECONDS.sleep(2); // 男生对女生说的话 String boy = exchanger.exchange("我很喜欢你..."); System.out.println("男生说:【" + boy +"】"); } catch (InterruptedException e) { e.printStackTrace(); } } } class Girl implements Runnable { private Exchanger<String> exchanger; public Girl(Exchanger<String> exchanger) { this.exchanger = exchanger; } @Override public void run() { try { // 女生对男生说的话 String girl = exchanger.exchange("我其实暗恋你很久了...", 1, TimeUnit.SECONDS); System.out.println("女生说:【" + girl +"】"); } catch (Exception e) { e.printStackTrace(); } } }
- 如上所示,
exchange()
方法还可以指定等待时间,如果当前线程在指定的等待时间内,没有等到另一个线程到达同步点,则会抛出 TimeoutException 异常
- 如上所示,
-