exchange java对象,【原】Java并发程序的一个应用Exchanger的实例

【原】Java并发程序的一个使用Exchanger的实例

今天看了些Exchanger的资料,有个喝水的例子不错。我这里细化了以下,并得到实现。

思路:

有一个Drinker和一个Waiter,有两个杯子,一个空杯子,一个杯子有3升水,Drinker一次喝1升水,要耗时1秒,Waiter一次可以倒1升水,一次耗时1秒。开始时,他们各持一个杯子,Drinker持有3升水的杯子,Waiter持有空杯子。然后开始喝水,当有一个杯子里没水了,整个程序结束。

方法:

Exchanger主要用于交换两个线程的同类型的共享数据,喝水这个例子很好的表现了Exchanger的作用。

【注:】程序中的数据可以自己调整来,整体体现了动态交换杯子的效果。

import java.util.concurrent.Exchanger;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

class Cup {

int waterVolume = 0;

String cupName="";

public String getCupName() {

return cupName;

}

public void setCupName(String cupName) {

this.cupName = cupName;

}

Cup(int i ,String name){

waterVolume=i;

cupName=name;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return cupName+"有"+waterVolume+"升水!";

}

public int getWaterVolume() {

return waterVolume;

}

public void drinkWater(){

waterVolume--;

}

public void drinkWater( int i ){

if((waterVolume-i)>=0){

waterVolume-=i;

}else{

System.out.println("没有这么多水可以喝!!!");

return;

}

}

public void addWater(){

waterVolume++;

}

public void addWater(int i){

waterVolume=i;

}

}

class Drinker implements Runnable{

Cup currentCup;

Exchanger ex;

Drinker(Exchanger ex,Cup c){

currentCup= c;

this.ex= ex;

}

@Override

public void run() {

//得到杯子喝水

/*try {

currentCup = (Cup)ex.exchange(currentCup);

} catch (InterruptedException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}*/

boolean flag = true;

while(flag){

if(currentCup.getWaterVolume() > 0){

System.out.println("喝水者:"+currentCup);

System.out.println("喝水者:从"+currentCup.getCupName()+"喝2升水,喝水用时1秒");

currentCup.drinkWater(2);

try {

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

// TODO: handle exception

e.printStackTrace();

}

}

if(currentCup.getWaterVolume() == 0){

System.out.println("喝水者:"+currentCup+",水喝光了!别加了!");

flag=false;

}

//服务员加完水后的杯子

try {

currentCup = (Cup)ex.exchange(currentCup);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

class Waiter implements Runnable{

Cup currentCup;

Exchanger ex;

Waiter(Exchanger ex,Cup c){

currentCup= c;

this.ex= ex;

}

@Override

public void run() {

//得到杯子加水

/*try {

currentCup = (Cup)ex.exchange(currentCup);

} catch (InterruptedException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}*/

boolean flag = true;

while(flag){

System.out.println("服务员:"+currentCup);

System.out.println("服务员:倒入"+currentCup.getCupName()+" 1升水,耗时1秒");

try {

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

// TODO: handle exception

e.printStackTrace();

}

currentCup.addWater();

//得到顾客递过来的杯子

try {

currentCup=(Cup)ex.exchange(currentCup);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if(currentCup.getWaterVolume() == 0){

System.out.println("服务员:"+currentCup+"水喝光了!!不加了!");

flag=false;

}

}

}

}

public class DrinkWaterDemo {

public static void main(String[] args) {

Cup cup1 = new Cup(3,"cup1");

Cup cup2 = new Cup(0,"cup2");

final Exchanger ec = new Exchanger();

ExecutorService es = Executors.newFixedThreadPool(2);

es.submit(new Waiter(ec,cup2));

es.submit(new Drinker(ec, cup1));

es.shutdown();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery 循环_jquery实现无限循环滚动

复制下面代码查看效果原文链接:https://blog.csdn.net/qq_45378970/article/details/108903054?utm_mediumdistribute.pc_category.none-task-blog-hot-4.nonecase&depth_1-utm_sourcedistribute.pc_category.none-task-blog-hot-4.nonecase&request_id作者…

html与java接口,JavaWeb学习——Servlet相关的接口和类

JavaWeb学习——Servlet相关的接口和类摘要:本文主要学习了Servlet相关的接口和类。Servlet的接口和类三种方式实现Servlet有三种方式:实现javax.servlet.Servlet接口。继承javax.servlet.GenericServlet类。继承javax.servlet.http.HttpServlet类。实现…

delphi7 获取dll的类_跟我学Java内存管理----JMM精华终章(类加载器)

1 类加载器1.1 类的加载过程当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。(1)加载就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用…

php autoload静态,Composer 中自动加载 autoload_static 问题

看来不是我一个人遇到这个问题。IDE 报语法错误,$loader 在别的类里面使用了私有成员。但是这个代码可以运行。先说一下为什么会有autoload_static.php 这个文件,代码里面其实有说明。$useStaticLoader PHP_VERSION_ID > 50600 && !defined(…

huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码

艾薇巴蒂!许久不见甚是想念,想必这”涨姿势”的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码构造哈夫曼树首先,我们需要了解哈夫曼树是什么:相关知识点路径: 路径是指从一个…

推荐系统相关科技论文写作建议

如何写标题 1、用一句话概括你所做的工作; 2、字数忌长(尽可能不要超过20单词,40-60 字符比较合适); 3、考虑搜索引擎的影响,包含关键词。 4、例子 例子1:Enhancing slope one recommendation…

php 检查类,检查类是否已定义 - PHP 7 中文文档

(PHP 4, PHP 5, PHP 7)class_exists – 检查类是否已定义说明class_exists( string $class_name[, bool $autoload true] ) : bool检查指定的类是否已定义。参数class_name类名。名字的匹配是不分区大小写的。autoload是否默认调用 [__autoload](php7/language.oop5.autoload)…

python人工智能入门纳米学位_学习笔记(一) - 机器学习纳米学位

不久前我在Udacity报名了数据分析和机器学习两门纳米课程。之所以对这个感兴趣是因为关注人工智能方面的资讯有一段时间了,觉得这是未来的趋势,希望今后能够在这方面有所成绩。选择纳米课程是因为我觉得它与Udacity的免费教程有些区别:有专业…

睡眠音频分割及识别问题(一)

问题描述 通过手机App的录音功能,获得用户一整夜的睡眠音频,对睡眠音频进行分割,并对睡眠阶段进行判定。 (1)假设条件一:用户在相对安静的环境下进行睡眠,背景音可能会出现风声、雨声、汽车噪音…

discuz和php的关系,UCenter和Discuz!的关系

在论坛上经常见到一些站长朋友问:我论坛升级后,登录不上去了,提示密码不对;头像不显示了,显示叉烧包;注册、登录不了,提示内部错误等等。这些问题都有个共同点,就是Discuz!论坛本身和…

睡眠音频分割及识别问题(四)--YAMNet简介

简介 YAMNet模型是在 AudioSet 数据集(一个大型音频、视频数据集)上训练的音频事件分类器。 模型输入 该模型接收包含任意长度波形的float32一维张量或 NumPy数组,且满足范围[-1.0, 1.0]内的单声道16kHz样本。在内部,该算法将波…

oracle运行环境配置,oracle 环境配置开机自启动

环境:centos 6.5 oracle 11g自启动之前问题虚拟机里的oracle环境,每次重启完系统,用plsql developer连接,先是报错:无TNS监听程序解决方法是切换到系统的oracle用户,执行lsnrctl start,但是执行之前,因为O…

睡眠音频分割及识别问题(二)

输入 通过手机麦克风录制的任意长度睡眠声音。 输出 睡眠阶段曲线,该曲线可以反映出深度睡眠,浅度睡眠、REM睡眠、清醒各个阶段。 研究的核心问题 1、录制策略 (1)每隔10分钟录制一段睡眠音; 2、采用什么策略来…

睡眠音频分割及识别问题(三)

文献一:PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition [摘要] 音频模式识别是机器学习领域的一个重要研究课题,包括音频标注、声场景分类、音乐分类、语音情感分类和声音事件检测等多项任务。最近,神…

对应oracle生成java对象,Java学习笔记(十三)——通过Netbeans开发环境生成oracle数据库中表的对应hibernate映射文件...

【前面的话】身体慢慢已经快好了,感觉真好,哈哈。这篇文章要通过Hibernate对数据库进行操作,而Netbeans可以直接通过数据库逆向生成对应的映射文件。基础文章,选择性阅读。【步骤】1、 在netbeans中选择服务,点击数据库…

qt如何实现backspace的功能_如何实现知识星球列表拖拽功能

本 篇讲解一下如何实现在知识星球中星球列表的拖拽,各位可能都知道,我创建了一个星球【Hi Android】,所以最近使用这个软件比较多,之前也写过关于这个软件如何生成分享卡的文章,就是那篇文章有小伙伴建议我写一个星球的…

睡眠音频分割及识别问题(五)--YAMNet进一步分析

简介 YAMNet 是一个经过预训练的深度网络,可基于 AudioSet-YouTube 语料库 预测 521 种音频事件类别,并采用Mobilenet_v1深度可分离卷积架构。 输入 模型训练所使用的音频特征计算方式如下: 所有音频均重采样为 16 kHz 单声道。 通过长度…

vb.net调用oracle存储过程,vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc...

vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc 我的VBNETORACLE增删改查学习笔记(本源码在VBNET2008下测试通过)学习VBNET有一段时间了,之前一直学习VB60。过度到NET后发现与之前所学习的有了相当大的变化。于是将编程经常用到的增删改查代码提炼出…

睡眠音频分割及识别问题(六)--输入输出及方案讨论

简介 2021年7月13日,我和我的三个研究生一起拜访了玉米树,和王总等一起针对睡眠音频分割及识别问题进行了深入的讨论,达成了如下共识。 输入 由于保存整个晚上的睡眠音频所需要的存储空间过大,目前拟采用每隔30分钟&#xff08…

python文件独特行数_python——文件和数据格式化练习题:文件独特行数

描述 统计附件文件中与其他任何其他行都不同的行的数量,即独特行的数量。 问题分析 这道题是python123课程里面的一道题,我先说一下我的分析过程: 要实现问题找到不同行数,那就要用每一行分别和出它以外剩余所有行比较&#xff0c…