重点是exchange()方法java
exchange()方法是阻塞执行的,能够设置超时时间 可调用不一样的Apiide
package com.f.fmodules.fuser.example.exchanger; import java.util.concurrent.Exchanger; public class ExchangerThread extends Thread{ private Exchanger<String> exchanger; private String threadName; private String changeString; ExchangerThread(String threadName, String changeString, Exchanger<String> 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<String> exchanger = new Exchanger<>(); ExchangerThread t1 = new ExchangerThread("1","changString1", exchanger); ExchangerThread t2 = new ExchangerThread("2","changString2", exchanger); t1.start(); t2.start(); } }
运行结果
this
例: 三个线程操做线程
package com.f.fmodules.fuser.example.exchanger; import java.util.concurrent.Exchanger; public class ExchangerTest { public static void main(String[] args) { Exchanger<String> 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]交换,而剩下的未获得配对的线程,则会被阻塞,永久等待,直到与之配对的线程到达位置,对于本程序,则只能强制将其中止code
阻塞状态
blog
可设置五秒超时时间it
System.out.println("Thread[" + threadName + "]交换到消息:" + exchanger.exchange(changeString, 5, TimeUnit.SECONDS));
运行结果io