java Exchanger 2
//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的更多相关文章
- JAVA Exchanger
//Exchanger工具类的使用案例 //本文给出一个简单的例子,实现两个线程之间交换数据,用Exchanger来做非常简单. import java.util.concurrent.Exchang ...
- JAVA之Exchanger
如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到Exchanger这个类,Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 【Java并发编程实战】-----“J.U.C”:Exchanger
前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...
- Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...
- Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...
- java.util.concurrent.Exchanger应用范例与原理浅析--转载
一.简介 Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据.在本文中我将采取由浅入深的方式来介绍分析这个工具类.首先我们来看看官方的api文档中的叙述: A ...
- java线程数据交换Exchanger
两个线程都等到交换函数才能完成交换数据操作,代码如下: package threadLock; import java.util.Random; import java.util.concurrent ...
- Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型
http://blog.csdn.net/a352193394/article/details/39503857 Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会 ...
随机推荐
- Tomcat安装及配置
用来进行web开发的工具有很多,Tomcat是其中一个开源的且免费的java Web服务器,是Apache软件基金会的项目.电脑上安装配置Tomcat的方法和java有些相同,不过首先需要配置好jav ...
- 最新IP地址数据库
2016年12月1日 最新发行版 265051条数据 基于:国内基于省市区以及运营商 国外基于国家 版本:全球旗舰版 国内精华版 国外拓展版 英文版 掩码版 字段:大洲 国家 省份 城市 县区 运营 ...
- jq生成目录文件树jQuery Ztree基本用法
转自:http://www.cnblogs.com/linjiqin/p/4547452.html 1.首先在页面上有<ul/>标签 ? 1 <ul id="tree&qu ...
- javascript优化--05模式(函数)
回调函数模式: 基本例子: var findNodes = function (callback) { ...................... if (typeof callback !== ' ...
- 寒假D1 B
B - B Crawling in process... Crawling failed Time Limit:0MS Memory Limit:0KB 64bit IO Format ...
- 水题 ZOJ 3880 Demacia of the Ancients
题目传送门 /* 水题:) */ #include <cstdio> #include <iostream> #include <algorithm> #inclu ...
- zoj 1097 普吕弗序列
题目大意:输入一颗无根树的括号序列,求这棵树的普吕弗序列. 分析思路: 1)普吕弗序列,可以参考维基百科,其做法是找出树中编号最小的叶子节点,并将此叶子节点及边删除,并输出其邻接的节点标号: 2)递归 ...
- SCU3033 Destroying a Painting(最小费用最大流)
题目大概说有一个有n*m个格子的画板,画板上每个格子都有颜色,现在要把所有格子的颜色改成红.绿或者蓝,改变的代价是二者RGB值的曼哈顿距离,还要求红绿蓝格子个数的最大值和最小值要尽可能接近,问最少的代 ...
- 【TYVJ】1982 武器分配(费用流)
http://tyvj.cn/Problem_Show.aspx?id=1982 一眼题.. 源向每个人连容量为1,费用为0的边. 每个人向一个中转节点na连容量1,费用0的边(你也可以不连,直接连后 ...
- [LintCode] Cosine Similarity 余弦公式
Cosine similarity is a measure of similarity between two vectors of an inner product space that meas ...