java5 Exchanger数据交换

用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。

package com.ljq.test.thread;

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 = "张三";
					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 = "李四";
					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){

				}
			}
		});
	}
}

返回结果:

线程pool-1-thread-1正在把数据‘张三‘换出去
线程pool-1-thread-2正在把数据‘李四‘换出去
线程pool-1-thread-1换回的数据为‘李四‘
线程pool-1-thread-2换回的数据为‘张三‘

  

时间: 2024-11-17 02:57:23

java5 Exchanger数据交换的相关文章

Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是CountDownLatch? 倒计时计数器,调用CountDownLatch对象的CountDown()方法就将计数器减一,当计数到达0时,则所有等待者或者全部等待者开始执行. 2.如何用? new CountDownLatch(1); 直接new,其构造函数必须传一个int类型的参数,参数的意思是: c

并发库应用之十 & 多线程数据交换Exchanger应用

申明:用大白话来说就是用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人会一直等待第二个人,直到第二个人拿着数据到来时,才能彼此交换数据. java.util.concurrent.Exchanger<V> V 表示可以交换的对象类型 对应构造方法摘要: Exchanger()    创建一个新的 Exchanger 方法摘要: V  exchange(V v)       等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程

[笔记][Java7并发编程实战手冊]3.8 并发任务间的数据交换Exchanger

[笔记][Java7并发编程实战手冊]系列文件夹 简单介绍 Exchanger 是一个同步辅助类.用于两个并发线程之间在一个同步点进行数据交换. 同意两个线程在某一个点进行数据交换. 本章exchanger 使用心得总结 两个线程必须使用同一个Exchanger对象,且仅仅能是两个线程间的数据交换 exchanger.exchange(v)的时候,当前线程会被堵塞,直到还有一个线程运行该方法,同一时候完成数据的交换 相似这样的数据交换的,生产者线程一定要先生产数据.再交换数据,消费者线程一定要先

Java多线程与并发库高级应用之线程数据交换Exchanger

JDK1.5提供了Exchanger用于两个线程的数据交换.两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据. Exchanger只提供了一个构造器: Exchanger():创建一个新的Exchanger. Exchanger中也只有两个方法: V exchange(V x): 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象. V exchange(V x, long timeout,

java中的线程协调与线程间的数据交换

Java中提供多种方式协调线程的工作. CountDownLatch:当多个也就是具体的数量等于CountDownLatch初始化参数的时候.线程达到了预期状态或者完成了预期工作时触发事件,其他线程可以等待这个事件来触发自己的后续工作.等待的线程是多个.达到了预期状态的线程会调用CountDownLatch的countDown方法.等待的线程会调用CountDownLatch的await方法. import java.util.concurrent.CountDownLatch; import

thread_Exchanger数据交换

Exchanger 是一个同步辅助类,用于两个并发线程之间在一个同步点进行数据交换.  允许两个线程在某一个点进行数据交换. 可以视作双向的同步队列: 可应用于基因算法.流水线设计等场景 Exchanger提供了 一个同步点 , 在这个同步点,两个线程可以交换数据 .每个线程通过exchange()方法的入口提供数据给另外的线程,并接收其它线程提供的数据,并返回. public class Exchanger1Test { // 场景描述:一对一的 生产者和消费者,生产者每次生产5个商品,然后消

Java--Exchanger用于进行线程间的数据交换

package com; import java.util.concurrent.Exchanger; /** * Created by yangyu on 16/11/28. */ /** * Exchanger用于进行线程间的数据交换: * 它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据: * 两个线程通过exchange方法交换数据,如果一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange方法 * 当两个线程都达到同步点时,这两个线程就可以交换数据,

JQuery + XML作为前后台数据交换格式实践

JQuery + xml作为前后台数据交换 JQuery提供良好的异步加载接口AJAX,可以局部更新页面数据, http://api.jquery.com/category/ajax/ xml作为一种轻量数据格式,被浏览器js引擎普遍支持,同json格式,但是没有json那么精简. 使用AJAX+xml数据格式来实现动态页面,有以下好处: 1. 松耦合, 页面HTML和数据彻底分离, 即表示层 和 数据层分开, 有利前台样式定制. 不同于以往后台脚本嵌套HTML标签,并输出数据到标签的合适位置,

iOS 中 XML 数据交换格式

     XML 是一种自描述的数据交换格式,但是 XML 的数据交换格式并没有 JSON 来的轻便,但是无可否认的是,XML 的应用范围也是非常广泛的,比如在 ROS(一个开源机器人操作系统)中利用 XML 来描述包的依赖关系等,当然还有很多了.      对于 XML 文档操作包括了"读"与"写",读入 XML 文档并分析的过程称为"解析" XML 文档,"解析" XML 文档在实际开发中是占很大比重的.      读写