`

多线程之Exchanger

 
阅读更多

package com.test6;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Exchanger;
 
/**
 * Exchanger这个类,估计大家是很少用到,笔者最近在项目也用到这个类,在项目使用这个类来用于两个线程进行交换数据缓存,
 * 比如一个线程来读数据,另一个线程在写入缓存,在这两个线程中用Exchanger进行交换数据.接下来我写了一段代码来说明这个类的使用场景:
 *
 */
public class ExchangerTest {
 
	public static void main(String[] args) {
		Exchanger<List<String>> exchanger = new Exchanger<List<String>>();
		new ReadThread(exchanger).start();// 启动读数据线程
		new WriteThread(exchanger).start();// 启动写数据线程
	}
 
}
 
class ReadThread extends Thread {
	private Exchanger<List<String>> exchanger;
	List<String> bufferList ;
	
 
	public ReadThread(Exchanger<List<String>> exchanger) {
		this.exchanger = exchanger;
	}
 
	@Override
	public void run() {
		System.out.println("ReadThread start");
		
		try {
			bufferList = exchanger.exchange(bufferList);
			for (String str : bufferList) {
				System.out.println(str);
			}
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("ReadThread end");
	}
}
 
class WriteThread extends Thread {
	private Exchanger<List<String>> exchanger;
	List<String> bufferList = new LinkedList<String>();
	
	public static final Integer BUFFER_SIZE = 10;
 
	public WriteThread(Exchanger<List<String>> exchanger) {
		this.exchanger = exchanger;
	}
 
	@Override
	public void run() {
		try {
			System.out.println("WriteThread start");
			for (int i = 0; i < BUFFER_SIZE; i++) {
				bufferList.add(String.valueOf('A' + i)); // 模拟读数据
			}
			System.out.println("WriteTread 准备好数据,睡眠5秒钟");
			Thread.sleep(5000);
			bufferList = exchanger.exchange(bufferList); // 从Exchanger获得缓存数据
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		 
		System.out.println("WriteTread end");
 
	}
}




运行结果:
ReadThread start
WriteThread start
WriteTread 准备好数据,睡眠5秒钟
65
66
67
68
69
70
71
72
73
74
ReadThread end
WriteTread end
0
0
分享到:
评论

相关推荐

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

    主要介绍了Java多线程编程之使用Exchanger数据交换实例,本文直接给出实例代码,需要的朋友可以参考下

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

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

    主要介绍了Java编程线程同步工具Exchanger的使用实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    Java多线程同步器代码详解

    主要介绍了Java多线程同步器代码详解,文章分别介绍了是CountDownLatch,Semaphore,Barrier和Exchanger以及其相关代码示例,具有一定参考价值,需要的朋友可以了解下。

    sooget exchanger

    (1) 多语言选择 界面文字和日志文字全部从外部的XML文件中提取。同时用户也可以生成自己的XML格式的语言文档,或者根据您的需要选择自己喜欢的文字说明。 (2) 丰富的背景选择 SooGet主窗口内的各个子窗口都...

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

    │ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...

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

    │ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...

    java线程并发semaphore类示例

    Java 5.0里新加了4个协调线程间进程的同步装置,它们分别是Semaphore, CountDownLatch, CyclicBarrier和Exchanger,本例主要介绍Semaphore,Semaphore是用来管理一个资源池的工具,可以看成是个通行证

    zmq_object_exchanger:在多个机器人之间共享信息

    zmq_object_exchanger 这些东西可以帮助您通过网络发送和接收任意Python对象-它使用pyzmq做到这一点。 Python对象被序列化,压缩并通过网络发送。 两端都有PriorityQueue,因此优先发送/接收具有较高优先级(较低...

    Java并发编程原理与实战

    了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程安全的原理(理论层面).mp4 synchronized保证线程安全的原理(jvm层面).mp4 单例问题...

    龙果 java并发编程原理实战

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    Java 并发编程原理与实战视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    龙果java并发编程完整视频

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    java并发编程

    第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 ...

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    Java JDK实例宝典

    7 一个支持多线程的服务器框架 13. 8 代理服务器 13. 9 Telnet客户端 13. 10 UDP编程 13. 11 聊天室服务器端 13. 12 聊天室客户端 13. 13 FTP客户端 第14章 数据库 14. 1 连接各种...

    java jdk实列宝典 光盘源代码

    一个支持多线程的服务器框架,GeneralServer.java; 代理服务器,ProxyServer.java; telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; ...

Global site tag (gtag.js) - Google Analytics