Java多线程--Exchanger(二)
来源:互联网 发布:中国大学生网络党课 编辑:程序博客网 时间:2024/06/05 02:22
1. 背景
类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据。每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程提供的数据,并返回。
当在运行不对称的活动时很有用。比如说,一个线程向buffer中填充数据,另一个线程从buffer中消费数据;这些线程可以用Exchange来交换数据。这个交换对于两个线程来说都是安全的。
2. 示范代码
package com.clzhang.sample.thread;import java.util.*;import java.util.concurrent.Exchanger;public class SyncExchanger { private static final Exchanger exchanger = new Exchanger(); class DataProducer implements Runnable { private List list = new ArrayList(); @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("生产了一个数据,耗时1秒"); list.add(new Date()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } try { list = (List) exchanger.exchange(list); } catch (InterruptedException e) { e.printStackTrace(); } for (Iterator iterator = list.iterator(); iterator.hasNext();) { System.out.println("Producer " + iterator.next()); } } } class DataConsumer implements Runnable { private List list = new ArrayList(); @Override public void run() { for (int i = 0; i < 5; i++) { list.add("这是一个收条。"); } try { list = (List) exchanger.exchange(list); } catch (InterruptedException e) { e.printStackTrace(); } for (Iterator iterator = list.iterator(); iterator.hasNext();) { Date d = (Date) iterator.next(); System.out.println("Consumer: " + d); } } } public static void main(String[] args) { SyncExchanger ins = new SyncExchanger(); new Thread(ins.new DataProducer()).start(); new Thread(ins.new DataConsumer()).start(); }}
输出
生产了一个数据,耗时1秒
生产了一个数据,耗时1秒
生产了一个数据,耗时1秒
生产了一个数据,耗时1秒
生产了一个数据,耗时1秒
Producer 这是一个收条。
Producer 这是一个收条。
Producer 这是一个收条。
Producer 这是一个收条。
Producer 这是一个收条。
Consumer: Thu Sep 12 17:21:39 CST 2013
Consumer: Thu Sep 12 17:21:40 CST 2013
Consumer: Thu Sep 12 17:21:41 CST 2013
Consumer: Thu Sep 12 17:21:42 CST 2013
Consumer: Thu Sep 12 17:21:43 CST 2013
阅读全文
0 0
- Java多线程--Exchanger(二)
- java多线程之(Exchanger)
- Java多线程--Exchanger(一)
- Java多线程之Exchanger(一)
- Java多线程之Exchanger
- JAVA多线程之Exchanger
- Java多线程之Exchanger
- Java多线程之Exchanger
- java多线程之Exchanger
- Java多线程十一 Exchanger
- java 多线程之Exchanger
- java多线程[8]:Exchanger
- (十二)java多线程之Exchanger
- Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- java多线程编程——同步器Exchanger(四)
- 【java】多线程控制(一)---Semaphore、Exchanger、CyclicBarrier、CountDownLatch
- Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
- Asp.Net MVC 5使用Identity之简单的注册和登陆
- 小白的踩坑记录——socket.io-解决多进程
- 动态内存开辟
- spring-Scheduled
- 对称的二叉树
- Java多线程--Exchanger(二)
- Oracle之JAVA数据导出工具-yellowcong
- 欢迎使用CSDN-markdown编辑器
- CentOS 中 nginx 负载均衡和反向代理的搭建 阅读 2449
- 高逼格Mac应用程序、软件分享【主要面向开发者和设计师】
- vb在串口通信中运行时错误‘380’无效属性值
- pip install scikit-image win安装错误
- Java多线程--同步计数器CountDownLatch
- 在Eclipse环境下配置Firefox浏览器