关于Java多线程和并发运行的学习(四)——之Exchanger
2014-09-14 13:53
309 查看
Exchanger:
可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给
可以用于实现两个人之间的数据交换,每个人在完成一定的事务后想要与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。
用法实例:以下是重点介绍的一个类,该类使用
内存一致性效果:对于通过
happen-before 从另一线程中相应的
(这句话的英文原文:Memory consistency effects: For each pair of threads that successfully exchange objects via an
happen-before those subsequent to a return from the corresponding
在这里实现一个小案例:
运行结果:
可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给
exchange方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为
SynchronousQueue的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。
可以用于实现两个人之间的数据交换,每个人在完成一定的事务后想要与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。
用法实例:以下是重点介绍的一个类,该类使用
Exchanger在线程间交换缓冲区,因此,在需要时,填充缓冲区的线程获取一个新腾空的缓冲区,并将填满的缓冲区传递给腾空缓冲区的线程:
class FillAndEmpty { Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>(); DataBuffer initialEmptyBuffer = ... a made-up type DataBuffer initialFullBuffer = ... class FillingLoop implements Runnable { public void run() { DataBuffer currentBuffer = initialEmptyBuffer; try { while (currentBuffer != null) { addToBuffer(currentBuffer); if (currentBuffer.isFull()) currentBuffer = exchanger.exchange(currentBuffer); } } catch (InterruptedException ex) { ... handle ... } } } class EmptyingLoop implements Runnable { public void run() { DataBuffer currentBuffer = initialFullBuffer; try { while (currentBuffer != null) { takeFromBuffer(currentBuffer); if (currentBuffer.isEmpty()) currentBuffer = exchanger.exchange(currentBuffer); } } catch (InterruptedException ex) { ... handle ...} } } void start() { new Thread(new FillingLoop()).start(); new Thread(new EmptyingLoop()).start(); } }
内存一致性效果:对于通过
Exchanger成功交换对象的每对线程,在每个线程
exchange()之前的操作
happen-before 从另一线程中相应的
exchange()返回 的后续操作。
(这句话的英文原文:Memory consistency effects: For each pair of threads that successfully exchange objects via an
Exchanger, actions prior to the
exchange()in each thread
happen-before those subsequent to a return from the corresponding
exchange()in the other thread. 翻译惨不忍睹,看不懂的看英文琢磨吧。也是蛮无奈的。)
在这里实现一个小案例:
package Multithreading; import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExchangerTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final Exchanger exchanger = new Exchanger(); service.execute(new Runnable() { public void run() { try { String data1 = "zxx"; System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 + "换出去"); Thread.sleep((long) (Math.random() * 10000)); /* * 等待另一个线程到达此交换点(除非当前线程被中断), * 然后将给定的对象传送给该线程,并接收该线程的对象。 */ String data2 = (String) exchanger.exchange(data1); System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2); } catch (Exception e) { } } }); service.execute(new Runnable() { public void run() { try { String data1 = "lhm"; System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 + "换出去"); Thread.sleep((long) (Math.random() * 10000)); String data2 = (String) exchanger.exchange(data1); System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2); } catch (Exception e) { } } }); } }
运行结果:
相关文章推荐
- 关于Java多线程和并发运行的学习(四)——之CountDownLatch
- 关于Java多线程和并发运行的学习(五)——阻塞队列
- 关于Java多线程和并发运行的学习(三)
- 关于Java多线程和并发运行的学习(一)
- 关于Java多线程和并发运行的学习(四)——之CyclicBarrier
- 关于Java多线程和并发运行的学习(四)——之Semaphore
- 关于Java多线程和并发运行的学习(五)——并发 Collection
- 关于Java多线程和并发运行的学习(二)
- 关于Java多线程和并发运行的学习(五)——同步集合类
- 关于Java多线程和并发运行的学习(四)——之Condition
- 关于Android SQLite3多线程并发问题,学习笔记。
- Java多线程编程--(9)学习Java5.0 并发编程包--线程工具类
- C#学习小记7一个多载,及我想实验关于抽象类能否直接编译运行
- java多线程并发——Exchanger 两个任务之间交换对象
- JAVA多线程与并发学习总结
- Java多线程和并发编程实践学习总结---提高篇1
- Java多线程编程--(8)学习Java5.0 并发编程包--线程池、Callable & Future 简介
- 关于JAVA多线程并发synchronized的测试与合理使用
- JAVA多线程与并发学习总结
- JAVA多线程与并发学习总结