//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. 小甲鱼PE详解之基址重定位详解(PE详解10)

    今天有一个朋友发短消息问我说“老师,为什么PE的格式要讲的这么这么细,这可不是一般的系哦”.其实之所以将PE结构放在解密系列继基础篇之后讲并且尽可能细致的讲,不是因为小甲鱼没事找事做,主要原因是因为P ...

  2. 【word xml】将word转化为xml格式后,如何在xml中卫word添加分页符

    1.首先在xml中找到我们需要添加分页符的位置 例如:我需要在这个第一部分上面添加一个分页符 2.找到这个[第一部分]这个位置之后,开始往上找,找到对应的位置 3.在</w:pPr>下方添 ...

  3. 添加网页ico

    <link rel="Shortcut Icon" href="/favicon.ico" />

  4. Spring的lookup-method标签

    Spring的解析源码 public void parseLookupOverrideSubElements(Element beanEle, MethodOverrides overrides) { ...

  5. mvc-3模型和数据(2)

    寻址引用 源代码现存的问题:当保存或通过find()查找记录时,所返回的实例并没有复制一份,因此对任何属性的修改都会影响原始资源:这里我们只想当调用update()方法时才会修改资源 //由于Mode ...

  6. js:语言精髓笔记11--动态语言特性(1)

    语言:程序最终被表达为数据(结构)和逻辑(算法),命令式和说明式/函数式语言分别从这两方面分类: 动态:在语言陈述时无法确定,必须在计算机执行时才能确定语言关系:JS是完全动态语言,导致其不确定性一般 ...

  7. Linux下设置memcached访问IP

    在虚拟机上装了memcached,本地访问可以,但从其它机器连这台机器的memcached应用总是报连接失败.防火墙的端口都是打开的.Google了才知道原来需要修改memcached的配置文件,将默 ...

  8. BZOJ3642 : [CEOI 2014] Cake

    rank[i]表示第i美味的是哪块 left[i]表示在k左边美味度为i的是哪块 right[i]表示在k右边美味度为i的是哪块 用3棵线段树分别维护d序列的区间最大值.left序列的区间最大值.ri ...

  9. 让ORACLE LIKE 时不区分大小写

    select * from t_resource_base where xdkm_id = '08975DBC-953B-42DC-AA01-65F168891CEE' and regexp_like ...

  10. BZOJ3236: [Ahoi2013]作业

    Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 ...