中国建设教育协会官方网站查,seo研究中心vip课程,江苏国龙翔建设网站.,亳州电子商务网站建设公司前言JDK中为了处理线程之间的同步问题#xff0c;除了提供锁机制之外#xff0c;还提供了几个非常有用的并发工具类#xff1a;CountDownLatch、CyclicBarrier、Semphore、Exchanger、Phaser#xff1b; CountDownLatch、CyclicBarrier、Semphore、Phaser 这四个工具类提…前言 JDK中为了处理线程之间的同步问题除了提供锁机制之外还提供了几个非常有用的并发工具类CountDownLatch、CyclicBarrier、Semphore、Exchanger、Phaser CountDownLatch、CyclicBarrier、Semphore、Phaser 这四个工具类提供一种并发流程的控制手段而Exchanger工具类则提供了在线程之间交换数据的一种手段。简介 Exchanger的功能是使2个线程之间交换数据有不少文章的说法是“传输数据”应该叫“交换数据”更合适因为这是两个线程都要向对方传送数据同时也获取对方的传送过来的数据是双向模式并不是一个线程向另一个线程传输数据。它比生产者/消费者模式使用的wait/notify要更加方便。 Exchanger 提供一个同步点在这个同步点处两个线程可以交换彼此数据。即一个线程调用了exchange( )方法交换数据到达了同步点然后就会一直阻塞等待另一个线程调用exchange( )方法来交换数据。所以要注意exchange( )方法是有阻塞的特性。Exchanger 可能在应用程序比如遗传算法和管道设计中很有用。方法摘要public V exchange(V x) throws InterruptedException等待另一个线程到达此交换点除非当前线程被中断然后将给定的对象传送给该线程并接收该线程的对象。public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException等待另一个线程到达此交换点除非当前线程被中断或者超出了指定的等待时间然后将给定的对象传送给该线程同时接收该线程的对 Example1 用法示例以下是重点介绍的一个类该类使用 Exchanger 在线程间交换缓冲区因此在需要时填充缓冲区的线程获取一个新腾空的缓冲区并将填满的缓冲区传递给腾空缓冲区的线程class FillAndEmpty {ExchangerDataBuffer exchanger new ExchangerDataBuffer();DataBuffer initialEmptyBuffer ... a made-up typeDataBuffer 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();}}
复制代码 Example2 应用场景示例Exchanger可以用于遗传算法遗传算法里需要选出两个人作为交配对象这时候会交换两人的数据并使用交叉规则得出2个交配结果。Exchanger也可以用于校对工作。比如我们需要将纸制银流通过人工的方式录入成电子银行流水为了避免错误采用AB岗两人进行录入录入到Excel之后系统需要加载这两个Excel并对这两个Excel数据进行校对看看是否录入的一致。代码如下private static final ExchangerString exgr new ExchangerString();
private static ExecutorService threadPool Executors.newFixedThreadPool(2);public static void main(String[] args) {threadPool.execute(new Runnable() {Overridepublic void run() {try {String A 银行流水A;// A录入银行流水数据exgr.exchange(A);//同步点交换数据} catch (InterruptedException e) {}}});threadPool.execute(new Runnable() {Overridepublic void run() {try {String B 银行流水B;// B录入银行流水数据String A exgr.exchange(B);//同步点交换数据System.out.println(A和B数据是否一致 A.equals(B) \nA录入的是 A \nB录入的是 B);} catch (InterruptedException e) {}}});threadPool.shutdown();
}
复制代码运行结果A和B数据是否一致false
A录入的是银行流水A
B录入的是银行流水B
复制代码文章源地址https://www.cnblogs.com/jinggod/p/8494384.html