//Listing 6-3. Using an Exchanger to Swap Buffers
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Exchanger; public class ExchangerDemo {
final static Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
final static DataBuffer initialEmptyBuffer = new DataBuffer();
final static DataBuffer initialFullBuffer = new DataBuffer("I"); public static void main(String[] args) {
class FillingLoop implements Runnable {
int count = ; @Override
public void run() {
DataBuffer currentBuffer = initialEmptyBuffer;
try {
while (true) {
addToBuffer(currentBuffer);
if (currentBuffer.isFull()) {
System.out
.println("filling thread wants to exchange");
currentBuffer = exchanger.exchange(currentBuffer);
System.out
.println("filling thread receives exchange");
}
}
} catch (InterruptedException ie) {
System.out.println("filling thread interrupted");
}
} void addToBuffer(DataBuffer buffer) {
String item = "NI" + count++;
System.out.println("Adding: " + item);
buffer.add(item);
}
}
class EmptyingLoop implements Runnable {
@Override
public void run() {
DataBuffer currentBuffer = initialFullBuffer;
try {
while (true) {
takeFromBuffer(currentBuffer);
if (currentBuffer.isEmpty()) {
System.out.println("emptying thread wants to "
+ "exchange");
currentBuffer = exchanger.exchange(currentBuffer);
System.out.println("emptying thread receives "
+ "exchange");
}
}
} catch (InterruptedException ie) {
System.out.println("emptying thread interrupted");
}
} void takeFromBuffer(DataBuffer buffer) {
System.out.println("taking: " + buffer.remove());
}
}
new Thread(new EmptyingLoop()).start();
new Thread(new FillingLoop()).start();
}
} class DataBuffer {
private final static int MAXITEMS = ;
private final List<String> items = new ArrayList<>(); DataBuffer() {
} DataBuffer(String prefix) {
for (int i = ; i < MAXITEMS; i++) {
String item = prefix + i;
System.out.printf("Adding %s%n", item);
items.add(item);
}
} synchronized void add(String s) {
if (!isFull())
items.add(s);
} synchronized boolean isEmpty() {
return items.size() == ;
} synchronized boolean isFull() {
return items.size() == MAXITEMS;
} synchronized String remove() {
if (!isEmpty())
return items.remove();
return null;
}
}

java Exchanger 2的更多相关文章

  1. JAVA Exchanger

    //Exchanger工具类的使用案例 //本文给出一个简单的例子,实现两个线程之间交换数据,用Exchanger来做非常简单. import java.util.concurrent.Exchang ...

  2. JAVA之Exchanger

    如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到Exchanger这个类,Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只 ...

  3. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  4. 【Java并发编程实战】-----“J.U.C”:Exchanger

    前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...

  5. Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger

    前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...

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

    本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...

  7. java.util.concurrent.Exchanger应用范例与原理浅析--转载

    一.简介   Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据.在本文中我将采取由浅入深的方式来介绍分析这个工具类.首先我们来看看官方的api文档中的叙述: A ...

  8. java线程数据交换Exchanger

    两个线程都等到交换函数才能完成交换数据操作,代码如下: package threadLock; import java.util.Random; import java.util.concurrent ...

  9. Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型

    http://blog.csdn.net/a352193394/article/details/39503857  Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会 ...

随机推荐

  1. hdu 1150 Machine Schedule 最少点覆盖转化为最大匹配

    Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  2. SqlServer数据库字典--索引.sql

    SELECT TOP 100 PERCENT --a.id,       CASE WHEN b.keyno = 1 THEN c.name ELSE '' END AS 表名,       CASE ...

  3. js:语言精髓笔记12--动态语言特性(2)

    对于括号内: 通过赋值时发生的重写: (Object1 = function() {}).prototype.value = 100; var obj1 = new Object1; console. ...

  4. eBay 消息发送(2)

      1.简介 Call Index Doc: http://developer.ebay.com/DevZone/XML/docs/Reference/eBay/index.html   消息发送主要 ...

  5. Fengshui-[SZU_B40]

    Description Fengshui is an ancient subject in Chinese tradition. Someone considers it as science and ...

  6. Ural 1018 (树形DP+背包+优化)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给 ...

  7. BZOJ2783: [JLOI2012]树

    Description 数列 提交文件:sequence.pas/c/cpp 输入文件:sequence.in 输出文件:sequence.out 问题描述: 把一个正整数分成一列连续的正整数之和.这 ...

  8. PHP + Redis 实现一个简单的twitter

    原文位于Redis官网http://redis.io/topics/twitter-clone Redis是NoSQL数据库中一个知名数据库,在新浪微博中亦有部署,适合固定数据量的热数据的访问. 作为 ...

  9. C#页面添加提交数据后跳出小弹窗的功能

    很简单,将小弹窗部分写进一个div,利用div的visible属性去控制是否显示,首先默认为false; 当后台程序执行到插入数据完成后,设置session状态值为‘yes’ 判断,当session状 ...

  10. 获取当前 Windows 的安装序列号

    Dim s s = InputBox("当前Windows系统序列号为:", "Windows序列号", GetWindowsSN) WScript.Quit ...