Exchanger: 两个线程 间 交换 数据
2011-11-04 16:54
423 查看
import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /* * Exchanger: 两个线程 间 交换 数据 * exchange() 等待另一个线程到达此交换点(除非当前线程被中断), * 然后将给定的对象传送给该线程,并接收该线程传来的对象。 * 即: 当线程为单数条时,那么总有条线程是交换不到数据的,该线程一直等待。。 * * 设计 一个小游戏:相亲随机配对 */ public class ExchangerTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final Exchanger<String> exchanger = new Exchanger<String>(); final List<String> males = new ArrayList<String>(); males.add("张三"); males.add("李四"); males.add("王五");males.add("赵六");males.add("卓七"); final List<String> females = new ArrayList<String>(); females.add("张晓"); females.add("李丽"); females.add("王梅");females.add("赵雅");females.add("卓红"); final Random random = new Random(); final int nums = 5; Runnable r1 = new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < nums; i++) { final int j = random.nextInt(nums - i); try { String data1 = males.get(j); System.out.println(Thread.currentThread().getName() + "正在把 :'" + data1 + "'提出速配"); Thread.sleep((long) (Math.random() * 1000)); String data2 = exchanger.exchange(data1); System.out.println(Thread.currentThread().getName() + "速配成功:'" + data1 + "'----" + "'" + data2+ "'"); males.remove(j); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; service.execute(r1); Runnable r2 = new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < nums; i++) { final int j = random.nextInt(nums - i); try { String data1 = females.get(j); System.out.println(Thread.currentThread().getName() + "正在把 :'" + data1 + "'提出速配"); Thread.sleep((long) (Math.random() * 1000)); String data2 = exchanger.exchange(data1); /* System.out.println(Thread.currentThread().getName() + "速配成功:'" + data1 + "'----" + "'" + data2+ "'");*/ females.remove(j); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; service.execute(r2); service.shutdown(); } }
相关文章推荐
- 多线程 : 使用 Exchanger 两个线程间交换数据(一手交钱一手交货)
- java学习——使用Exchanger实现两个线程间的数据交换
- 黑马程序员-Condition条件对象、Semaphore、CyclicBarrier、倒计时门栓 CountDownLatch、Exchanger(实现两个线程之间数据交换
- Exchanger——Java两个线程间交换数据的工具类
- Exchanger两个线程之间的数据交换
- java多线程-Thread两个线程交换数据Exchanger
- 两个线程进行数据交换的Exchanger
- Java线程总结(十):并发包------两个线程交换数据Exchanger
- Exchanger两个线程之间交换数据
- Java多线程/并发25、Exchanger线程数据交换
- 使用Exchanger实现线程间的数据交换
- Java并发工具类之线程间数据交换工具Exchanger
- Exchanger 实现两个伙伴线程之间的数据交互
- 多线程编程13-----Exchanger同步工具类实现两线程数据交换
- Java多线程与并发库高级应用之线程数据交换Exchanger
- Exchanger用于线程间交换数据
- Java Exchanger(两线程交换数据)
- Exchanger兄弟线程间数据信息交换
- exchanger 线程之间交换数据
- 并发工具类(四)线程间的交换数据 Exchanger