`
chenzehe
  • 浏览: 538151 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

同步工具类之Exchanger

 
阅读更多

    Exchanger<V>,java.util.concurrent包下, 用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据,V - 可以交换的对象类型。

构造方法

public Exchanger()创建一个新的 Exchanger。 

方法摘要

V exchange(V x) 
          等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。 
V exchange(V x, long timeout, TimeUnit unit) 
          等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。 

如下代码中使用Exchanger交换value的值:

/**
 * Huisou.com Inc.
 * Copyright (c) 2011-2012 All Rights Reserved.
 */

package thread;

import java.util.concurrent.Exchanger;

/**
 * @description
 * 
 * @author chenzehe
 * @email hljuczh@163.com
 * @create 2013-1-11 下午04:52:41
 */

public class ExchangerTest {
	public static void main(String[] args) {
		Exchanger<String> exchanger = new Exchanger<String>();
		new Thread(new ExchangerThread("A", exchanger)).start();
		new Thread(new ExchangerThread("B", exchanger)).start();
		
	}
	
}

class ExchangerThread implements Runnable {
	String				value;
	Exchanger<String>	exchanger;
	
	public ExchangerThread(String value, Exchanger<String> exchanger) {
		this.value = value;
		this.exchanger = exchanger;
	}
	
	@Override
	public void run() {
		try {
			System.out.println(Thread.currentThread().getName() + " before exchange:value-" + value);
			Thread.sleep(3000);
			value = exchanger.exchange(value);
			System.out.println(Thread.currentThread().getName() + " after exchange:value-" + value);
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

Thread-0 before exchange:value-A
Thread-1 before exchange:value-B
Thread-1 after exchange:value-A
Thread-0 after exchange:value-B 
 

    下面代码中,该类使用 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();
   }
  }
分享到:
评论

相关推荐

    Java编程线程同步工具Exchanger的使用实例解析

    Java编程线程同步工具Exchanger的使用实例解析 Java编程线程同步工具Exchanger是Java编程语言中的一种线程同步工具,它提供了一种方便的方式来交换线程之间的信息。Exchanger类可以作为两个线程交换对象的同步点,...

    java并发工具类(CountDownLatch+Semaphore+Exchanger)

    Java并发工具类是Java并发编程中的重要组成部分,其中包括了多种实用的工具,如CountDownLatch、Semaphore和Exchanger,这些工具类极大地简化了多线程环境下的同步和协调问题。 1. **CountDownLatch**: ...

    Java:Exchanger类的作用.docx

    Java中的`Exchanger`类是`java.util.concurrent`包...为了确保正确性,开发者需要确保线程之间的交互是有序的,避免并发问题,这通常涉及到更复杂的同步策略或者使用其他并发工具,如`CyclicBarrier`或`Semaphore`等。

    java并发之并发工具类

    Java 并发工具类中有很多种,今天我们主要介绍四种:CyclicBarrier、CountDownLatch、Semaphore 和 Exchanger。 一、CyclicBarrier CyclicBarrier 是一种同步工具,允许一组线程互相等待,直到到达某个公共屏障点...

    通俗易懂学习java并发工具类-Semaphore,Exchanger

    【Exchanger详解】Exchanger是另一个并发工具类,它用于两个线程之间交换数据。Exchanger提供一个同步点,当两个线程都到达同步点时,它们可以交换它们的数据。这种机制适用于一对一线程间的协作,例如在多阶段计算...

    29 一手交钱,一手交货—Exchanger详解.pdf

    在Java并发编程中,Exchanger是一个非常有用的工具类,它允许两个线程间进行数据交换。这个类在处理需要同步的交互式任务时特别有用,比如在多阶段处理或者需要线程间协作的情况。Exchanger的工作原理就像一个中介,...

    Java多线程编程之使用Exchanger数据交换实例

    Java多线程编程中的Exchanger是一个非常有用的工具类,它位于`...在设计多线程程序时,根据具体业务场景选择适合的同步工具,如Synchronized、Semaphore、CyclicBarrier、CountDownLatch等,以达到最佳性能和可维护性。

    并发编程——并发工具类.pdf

    并发工具类则是Java中用于支持多线程协作和同步控制的一系列工具,它们可以简化并发控制逻辑,提高开发效率,并且减少因并发编程带来的错误。 #### 标题与描述解析 标题“并发编程——并发工具类.pdf”预示了文档...

    java并发工具类

    Java并发工具类是Java平台提供的一系列用于处理多线程并发问题的类和接口,它们在`java.util.concurrent`包中。并发问题主要包括资源竞争、死锁、活锁以及饥饿等,合理使用并发工具可以有效地提高程序的并发性能并...

    笔记-2、线程的并发工具类2

    这些工具类极大地简化了并发编程中的同步和通信问题,使得开发者能够更安全、高效地编写多线程程序。以下是针对给定标题和描述中提到的一些主要并发工具类的详细解释: 1. **Fork-Join框架** Fork-Join框架是Java ...

    JUC面试知识点手册快速版

    第二章:基础同步工具 2.1 synchronized关键字 2.2 volatile关键字 第三章:锁机制 3.1 ReentrantLock 3.2 ReadWriteLock 3.3 StampedLock 第四章:同步辅助工具 4.1 CountDownLatch 4.2 CyclicBarrier ...

    Java中的5种同步辅助类介绍

    Java中的同步辅助类是用于控制并发执行和线程间协作的重要工具,它们提供了比`synchronized`关键字和`wait/notify`机制更为高级和灵活的同步机制。以下将详细介绍五种常用的同步辅助类: 1. **Semaphore(信号量)*...

    第20章 Part4 并发工具同步器.pdf

    ### 第20章 Part4 并发工具同步器 #### 主要内容概述 本章节主要介绍了Java中的并发工具,特别是同步器的相关概念和技术。这部分内容是构建高效、可靠的并发应用程序的基础,尤其对于需要处理大量并发任务的应用...

    JAVA并发编程-2-线程并发工具类

    JAVA并发编程-2-线程并发工具类一、Fork/Join1、分而治之与工作密取2、使用标准范式3、Fork/Join的同步用法4、Fork/Join的异步用法二、CountDownLatch三、CyclicBarrier四、Semaphore信号量五、Exchanger ...

    某电信项目多线程同步数据实例

    5. **并发工具类**:Java并发包(java.util.concurrent)中包含许多工具类,如Semaphore(信号量)、CountDownLatch(倒计时锁)、CyclicBarrier(回环栅栏)和Exchanger(交换器),它们是设计复杂多线程同步场景的...

    java加强笔记

    Java5的Exchanger同步工具 - `Exchanger`可以实现线程间的双向交换。 ##### 18. Java5阻塞队列的应用 - 阻塞队列(`BlockingQueue`)提供了一种线程安全的队列实现。 ##### 19. Java5同步集合类的应用 - 同步集合类...

    java.util.concurrent_您不知道的5件事

    除了上述两种同步工具之外,`java.util.concurrent` 包还提供了其他有用的类,如 `CyclicBarrier` 和 `Exchanger` 等,它们都是为了简化并发编程而设计的。 - **CyclicBarrier**:允许一组线程互相等待,直到所有...

    深入浅出_Java并发工具包原理讲解

    Java并发工具包(J.U.C)是Java编程语言中用于并发编程的一系列工具包的统称,它包含了一系列方便实现多线程编程的类和接口,使得开发者可以更加方便地编写高效、线程安全的程序。本文将深入浅出地探讨J.U.C的原理和...

    Java并发编程实践-03章-使用JDK并发包构建程序1

    Exchanger是一个用于线程间数据交换的同步工具类。两个线程可以使用Exchanger交换数据,当一方准备好数据后,另一方必须已经到达交换点才能进行交换。 **3.4.5 Future和FutureTask** Future接口代表异步计算的结果...

Global site tag (gtag.js) - Google Analytics