`

java多线程编程——同步器Exchanger(四)

阅读更多
类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据。每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程提供的数据,并返回。
当在运行不对称的活动时很有用,比如当一个线程填充了buffer,另一个线程从buffer中消费数据的时候,这两个线程可以用Exchanger来交换数据。当两个线程通过Exchanger交换数据的时候,这个交换对于两个线程来说是线程安全的。两个线程都会等到自己的程序运行到Exchanger这个地方时,进行等待。然后再进行数据交换,交换完毕后,各自进行以后的程序流程。


以下这个程序demo要做的事情就是生产者在交换前生产5个"生产者",然后再与消费者交换5个数据,然后再生产5个"交换后生产者",而消费者要在交换前消费5个"消费者",然后再与生产者交换5个数据,然后再消费5个"交换后消费者"。
package test;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Exchanger;

/**
 * 两个线程间的数据交换
 *
 * @author Administrator
 *
 */
@SuppressWarnings("all")
public class ExchangerDemo {

	private static final Exchanger ex = new Exchanger();

	class DataProducer implements Runnable {
		private List list = new ArrayList();

		public void run() {
			System.out.println("生产者开始运行");
			System.out.println("开始生产数据");
			for (int i = 1; i <= 5; i++) {
				System.out.println("生产了第" + i + "个数据,耗时1秒");
				list.add("生产者" + i);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("生产数据结束");
			System.out.println("开始与消费者交换数据");
			try {
				// 将数据准备用于交换,并返回消费者的数据
				list = (List) ex.exchange(list);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("结束与消费者交换数据");
			System.out.println("生产者与消费者交换数据后,再生产数据");
			for (int i = 6; i < 10; i++) {
				System.out.println("交换后生产了第" + i + "个数据,耗时1秒");
				list.add("交换后生产者" + i);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("开始遍历生产者交换后的数据");
			// 开始遍历生产者的数据
			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
				System.out.println(iterator.next());
			}
		}
	}

	class DataConsumer implements Runnable {
		private List list = new ArrayList();

		public void run() {
			System.out.println("消费者开始运行");
			System.out.println("开始消费数据");
			for (int i = 1; i <= 5; i++) {
				System.out.println("消费了第" + i + "个数据");
				// 消费者产生数据,后面交换的时候给生产者
				list.add("消费者" + i);
			}
			System.out.println("消费数据结束");
			System.out.println("开始与生产者交换数据");
			try {
				// 进行数据交换,返回生产者的数据
				list = (List) ex.exchange(list);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("消费者与生产者交换数据后,再消费数据");
			for (int i = 6; i < 10; i++) {
				System.out.println("交换后消费了第" + i + "个数据");
				list.add("交换后消费者" + i);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("开始遍历消费者交换后的数据");
			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
				System.out.println(iterator.next());
			}
		}
	}

	public static void main(String args[]) {
		ExchangerDemo et = new ExchangerDemo();
		new Thread(et.new DataProducer()).start();
		new Thread(et.new DataConsumer()).start();
	}
}


执行结果

    生产者开始运行
    开始生产数据
    生产了第1个数据,耗时1秒
    消费者开始运行
    开始消费数据
    消费了第1个数据
    消费了第2个数据
    消费了第3个数据
    消费了第4个数据
    消费了第5个数据
    消费数据结束
    开始与生产者交换数据
    生产了第2个数据,耗时1秒
    生产了第3个数据,耗时1秒
    生产了第4个数据,耗时1秒
    生产了第5个数据,耗时1秒
    生产数据结束
    开始与消费者交换数据
    消费者与生产者交换数据后,再消费数据
    交换后消费了第6个数据
    结束与消费者交换数据
    生产者与消费者交换数据后,再生产数据
    交换后生产了第6个数据,耗时1秒
    交换后消费了第7个数据
    交换后生产了第7个数据,耗时1秒
    交换后消费了第8个数据
    交换后生产了第8个数据,耗时1秒
    交换后消费了第9个数据
    交换后生产了第9个数据,耗时1秒
    开始遍历消费者交换后的数据
    生产者1
    生产者2
    生产者3
    生产者4
    生产者5
    交换后消费者6
    开始遍历生产者交换后的数据
    交换后消费者7
    交换后消费者8
    消费者1
    交换后消费者9
    消费者2
    消费者3
    消费者4
    消费者5
    交换后生产者6
    交换后生产者7
    交换后生产者8
    交换后生产者9


分享到:
评论

相关推荐

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

    3. Exchanger的应用场景:Exchanger可以应用于各种需要线程之间交换数据的场景,例如,在多线程编程中,Exchanger可以用来实现线程之间的数据交换,从而提高程序的效率和可靠性。 Exchanger的优点: 1. 方便易用:...

    java并发编程之同步器代码示例

    Java并发编程之同步器代码示例 ...Java并发编程之同步器代码示例展示了Java中的同步器机制,包括CountDownLatch、Semaphore、Barrier和Exchanger队列同步器等,帮助开发者更好地理解和使用Java中的并发编程技术。

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、介绍三种高效优雅的Singleton实现方式.wmv │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细...

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

    Java多线程编程中的Exchanger是一个非常有用的工具类,它位于`java.util.concurrent`包下,主要用于线程间的数据交换。Exchanger的核心功能是让两个线程在一个同步点相遇,进行数据交换。当一个线程调用`exchange`...

    java线程与并发编程实践

    异常处理在多线程编程中同样重要。线程的中断(interrupt())和检查中断状态(isInterrupted()、interrupted())是处理异常情况的关键。同时,当一个线程抛出未捕获异常时,会终止该线程并通知其父线程。 在《java...

    经典Java多线程与并发库高级应用

    这些技术点都旨在帮助开发者深入理解和运用Java多线程编程,使得开发者可以编写出健壮的并发程序。 总结来说,Java多线程与并发库的高级应用,既包括了传统的多线程编程技术,也包含了JDK 1.5之后引入的高级并发...

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

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

    Java多线程、并发编程知识点总结.pdf

    Java多线程编程是Java语言的核心特性之一,它允许程序同时执行多个线程,从而实现多任务的并行处理,提高程序执行效率和用户体验。在Java中,多线程的实现主要涉及到以下几个关键知识点: 1. **线程的基本概念**:...

    张孝祥Java多线程与并发库高级应用笔记

    ### 张孝祥Java多线程与并发库高级应用笔记...对于希望提升多线程编程技能的Java开发者来说,这是一份宝贵的学习资源。通过深入研究这些知识点,开发者可以更好地应对多线程环境下的各种挑战,提高软件的性能和稳定性。

    java多线程设计模式(pdf)

    《Java多线程设计模式》是一本专注于Java并发编程的权威指南,对于深入理解Java并发机制和提升多线程编程技能具有极高的价值。这本书详细介绍了如何在Java环境中有效地使用多线程,以及如何设计出高效、可维护的并发...

    深入了解java多线程

    本文将深入探讨Java多线程的核心概念,包括线程的定义、线程的生命周期、线程间的通信与同步机制,以及如何在实际编程中有效地使用多线程。 ### 1. 线程基础 #### 1.1 什么是线程? 线程是操作系统能够进行运算...

    深入解析Java多线程

    最后,我们还需要了解Java并发工具类,如Semaphore(信号量)、CountDownLatch(计数器)、CyclicBarrier(回环栅栏)和Exchanger(交换器),它们为多线程编程提供了强大的支持。 总结来说,Java多线程涉及的内容...

    Android多线程全新讲解.pdf

    综合以上信息,这份文档是一个关于Java多线程编程的全面介绍,从基础知识到高级特性,从API使用到同步机制,再到具体的编程实例,内容丰富。它可能被设计为一个教程,逐步引导读者从初学者水平过渡到能够理解和运用...

    JAVA线程高级-线程按序交替执行

    在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...

    Java多线程同步器代码详解

    Java多线程同步器在并发编程中扮演着至关重要的角色,它们帮助开发者管理线程间的协作,确保资源的正确访问和程序的顺序执行。本文将深入解析四种主要的同步器:CountDownLatch、Semaphore、Barrier和Exchanger,并...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、介绍三种高效优雅的Singleton实现方式.wmv │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细...

    面向Java多线程机制的软件重构方法.pdf

    2. 使用并发工具类:如`CountDownLatch`, `CyclicBarrier`, `Semaphore`, `Exchanger`等,提升多线程编程的灵活性和安全性。 3. 线程安全的数据结构:`ConcurrentHashMap`, `CopyOnWriteArrayList`等并发容器可保证...

    多线程笔记_java/多线程_

    在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在开发高效能和响应迅速的应用时。本文档将全面解析多线程的基础知识,从简单到复杂,帮助开发者深入理解并掌握这一核心技术。 一、多线程基础 1.1 线程...

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

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

    java多线程

    Java多线程是Java编程中一个非常重要的概念,它允许程序同时执行多个任务,从而提高系统...通过这些知识的学习,开发者可以更好地理解和掌握Java多线程编程,有效地解决网络编程中的并发问题,提升程序的效率和稳定性。

Global site tag (gtag.js) - Google Analytics