Java Exchanger
2014-10-16 12:14
162 查看
Exchanger 简介
JDK1.5 java.util.concurrent 包 提供了 Exchanger类允许在2个线程间定义同步点,当2个线程到达这个点,他们相互交换数据类型,使用第一个线程的数据类型变成第二个的,然后第二个线程的数据类型变成第一个的。
JDK 原文介绍如下:
A synchronization point at which threads can pair and swap elements within pairs. Each thread presents some object on entry to the exchange method, matches with a partner thread, and receives its partner's object on return.
An Exchanger may be viewed as a bidirectional form of a SynchronousQueue. Exchangers may be useful in applications such as genetic algorithms and pipeline designs.
一个非常经典的并发问题:你有相同的数据buffer,一个或多个数据生产者,和一个或多个数据消费者。只是Exchange类只能同步2个线程,所以你只能在你的生产者和消费者问题中只有一个生产者和一个消费者时使用这个类。
Exchanger示例
这里用Exchanger来模拟经典的生产者和消费者问题,示例代码如下:
JDK1.5 java.util.concurrent 包 提供了 Exchanger类允许在2个线程间定义同步点,当2个线程到达这个点,他们相互交换数据类型,使用第一个线程的数据类型变成第二个的,然后第二个线程的数据类型变成第一个的。
JDK 原文介绍如下:
A synchronization point at which threads can pair and swap elements within pairs. Each thread presents some object on entry to the exchange method, matches with a partner thread, and receives its partner's object on return.
An Exchanger may be viewed as a bidirectional form of a SynchronousQueue. Exchangers may be useful in applications such as genetic algorithms and pipeline designs.
一个非常经典的并发问题:你有相同的数据buffer,一个或多个数据生产者,和一个或多个数据消费者。只是Exchange类只能同步2个线程,所以你只能在你的生产者和消费者问题中只有一个生产者和一个消费者时使用这个类。
Exchanger示例
这里用Exchanger来模拟经典的生产者和消费者问题,示例代码如下:
package com.ricky.java.test.exchanger; import java.util.concurrent.Exchanger; public class ExchangerTest { /** * @param args */ public static void main(String[] args) { Exchanger<Data> exchanger = new Exchanger<>(); new Thread(new Producer(exchanger)).start(); new Thread(new Consumer(exchanger)).start(); } //生产者 public static class Producer implements Runnable{ private Exchanger<Data> exchanger; private int id = 1; public Producer(Exchanger<Data> exchanger){ this.exchanger = exchanger; } @Override public void run() { boolean flag = true; while(flag){ try { Data data = new Data(id,"I produce data,id="+id,System.currentTimeMillis()); System.out.println("Producer start exchange,id="+id+" data="+data); Data x = exchanger.exchange(data); System.out.println("Producer exchange over "+id+" receive="+x); id++; sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } } //消费者 public static class Consumer implements Runnable{ private Exchanger<Data> exchanger; private int id = 1; public Consumer(Exchanger<Data> exchanger){ this.exchanger = exchanger; } @Override public void run() { boolean flag = true; while(flag){ try { Data data = new Data(id,"I have consume data,id="+id,System.currentTimeMillis()); System.out.println("Consumer start exchange,id="+id+" data="+data); Data x = exchanger.exchange(data); System.out.println("Consumer exchange over,id="+id+" receive="+x); id++; sleep(2500); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static class Data{ private int id; private String content; private long time; public Data(){ } public Data(int id,String content,long time){ this.id = id; this.content = content; this.time = time; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public long getTime() { return time; } public void setTime(long time) { this.time = time; } @Override public String toString() { return "Data [id=" + id + ", content=" + content + ", time=" + time + "]"; } } public static void sleep(int millis) throws InterruptedException{ Thread.sleep(millis); } }
相关文章推荐
- 什么是MX
- Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- 黑马程序员-Condition条件对象、Semaphore、CyclicBarrier、倒计时门栓 CountDownLatch、Exchanger(实现两个线程之间数据交换
- 《黑马程序员》 并发中的Exchanger同步工具类
- 《黑马程序员》并发库中Exchanger示例代码
- Exchanger 应用
- current包下Exchanger的使用
- Java 线程数据交换控制器Exchange使用实例
- Java多线程并发常用类实例之:exchanger
- Exchanger的使用
- Java并发编程中级篇(七):并发任务间交换数据
- java5的Exchanger同步工具
- 使用Exchanger实现线程间的数据交换
- Java并发工具类详解
- java同步工具类之Exchanger
- Java多线程 -- JUC包源码分析16 -- Exchanger源码分析
- java线程Exchanger
- java中的并发工具类
- 在并发任务间交换数据-生产消费者3
- Java之Exchanger使用