Exchanger类的作用
Exchanger的功能可以使两个线程(重点: 只有两个线程)之间传输数据
-
重点是exchange()方法
-
exchange()方法是阻塞执行的,可以设置超时时间 可调用不同的Api
package com.f.fmodules.fuser.example.exchanger; import java.util.concurrent.Exchanger; public class ExchangerThread extends Thread{ private Exchanger
exchanger; private String threadName; private String changeString; ExchangerThread(String threadName, String changeString, Exchanger exchanger) { super(); this.threadName = threadName; this.changeString = changeString; this.exchanger = exchanger; } @Override public void run() { try { System.out.println("Thread[" + threadName + "]交换到消息:" + exchanger.exchange(changeString)); } catch (Exception e) { e.printStackTrace(); } } } package com.f.fmodules.fuser.example.exchanger; import java.util.concurrent.Exchanger; public class ExchangerTest { public static void main(String[] args) { Exchanger
exchanger = new Exchanger<>(); ExchangerThread t1 = new ExchangerThread("1","changString1", exchanger); ExchangerThread t2 = new ExchangerThread("2","changString2", exchanger); t1.start(); t2.start(); } } -
运行结果
-
例: 三个线程操作
package com.f.fmodules.fuser.example.exchanger; import java.util.concurrent.Exchanger; public class ExchangerTest { public static void main(String[] args) { Exchanger
exchanger = new Exchanger<>(); ExchangerThread t1 = new ExchangerThread("1","changString1", exchanger); ExchangerThread t2 = new ExchangerThread("2","changString2", exchanger); ExchangerThread t3 = new ExchangerThread("3","changString3", exchanger); t1.start(); t2.start(); t3.start(); } } -
此时程序的运行结果是不确定的,多次运行可以发现,配对结果可能是Thread[2]和Thread[3]交换,也可能是Thread[1]和Thread[2]交换,而剩下的未得到配对的线程,则会被阻塞,永久等待,直到与之配对的线程到达位置,对于本程序,则只能强制将其停止
-
阻塞状态
-
可设置五秒超时时间
System.out.println("Thread[" + threadName + "]交换到消息:" + exchanger.exchange(changeString, 5, TimeUnit.SECONDS));
-
运行结果