Java Exchanger
来源:互联网 发布:淘宝客招代理 编辑:程序博客网 时间:2024/05/21 09:38
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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic String toString() {return "Data [id=" + id + ", content=" + content + ", time=" + time+ "]";}}public static void sleep(int millis) throws InterruptedException{Thread.sleep(millis);}}
0 0
- Java Exchanger
- Java Exchanger
- Java多线程之Exchanger
- Java线程之Exchanger
- JAVA多线程之Exchanger
- Java多线程之Exchanger
- java线程之Exchanger
- Java多线程之Exchanger
- java并发--Exchanger
- java Exchanger原理
- java.util.concurrent.Exchanger
- Java并发同步器--Exchanger
- java多线程之Exchanger
- Java高级之Exchanger
- 《Java源码分析》:Exchanger
- java线程Exchanger
- Java多线程十一 Exchanger
- Java线程通信-Exchanger
- ios7适配一些问题
- Scala中的集合:Iterator、BitSet、Set、Map、Stack、Vector、List、Array
- 招聘程序员之如何让金子正确发光
- WebView 的使用
- linux内核中链表操作
- Java Exchanger
- dedecms标签:autochannel-指定栏目
- 网站收藏
- 大数相加
- java的学习要点
- JAVA交流群
- Leetcode:Search for a Range
- java实现栈
- 孫舜孝 勿齊 七休居士