akka与neety_Akka STM –与STM Ref和Agent一起打乒乓球

akka与neety

乒乓是一个经典示例,其中2个玩家(或线程)访问共享资源–乒乓表并在彼此之间传递Ball(状态变量)。 使用任何共享资源,除非我们同步访问,否则线程可能会遇到潜在的死锁情况。

PingPong算法非常简单

如果轮到我{
更新下一轮
ping / pong-记录点击
通知其他线程
}其他{
等待通知
}

让我们来看一个例子,看看它是如何工作的! 这是我们的Player类,它实现Runnable并接受对共享资源和消息的访问

public class Player implements Runnable {PingPong myTable;  Table where they playString myOpponent;public Player(String opponent, PingPong table) {myTable = table;myOpponent = opponent;}public void run() {while (myTable.hit(myOpponent));}}

其次,我们看到PingPong表类,该类具有一个同步方法hit(),无论是否轮到我,都将在其中进行检查。 如果轮到我了,请记录ping并更新对手姓名的共享变量。

public class PingPong {state variable identifying whose turn it is.private String whoseTurn = null;public synchronized boolean hit(String opponent) {String x = Thread.currentThread().getName();if (x.compareTo(whoseTurn) == 0) {System.out.println('PING! (' + x + ')');whoseTurn = opponent;notifyAll();} else {try {  wait(2500); } catch (InterruptedException e) { }}}}

接下来,我们开始游戏并使玩家开始!

public class Game {public static void main(String args[]) {PingPong table = new PingPong();Thread alice = new Thread(new Player('bob', table));Thread bob = new Thread(new Player('alice', table));alice.setName('alice');bob.setName('bob');alice.start();  alice starts playingbob.start();  bob starts playingtry {Wait 5 secondsThread.sleep(5000);} catch (InterruptedException e) {}table.hit('DONE');  cause the players to quit their threads.try {Thread.sleep(100);} catch (InterruptedException e) {}}}

就是这样,我们正在运行PingPong游戏。 在这种情况下,我们看到了同步方法hit()如何仅允许一个线程访问共享资源–其Turn。

Akka STM提供了两个构造Refs和Agents。 引用(事务引用)提供对多个身份的协调同步访问。 代理提供对单个身份的非协调异步访问。

参考

在我们的例子中,由于共享状态变量是单个标识,因此引用的使用是过大的,但是我们仍然会继续查看它们的用法。

public class PingPong {updates to Ref.View are synchronousRef.View<String> whoseTurn;public PingPong(Ref.View<String> player) {whoseTurn = player;}public boolean hit(final String opponent) {final String x = Thread.currentThread().getName();if (x.compareTo(whoseTurn.get()) == 0) {System.out.println('PING! (' + x + ')');whoseTurn.set(opponent);} else {try {wait(2500);} catch (Exception e) {}}}}

这里的关键是以下

  • 同步关键字丢失
  • 将状态变量定义为Ref
    //对Ref.View的更新是同步的
    Ref.View <string>其Turn;
  • 调用更新Ref是协调和同步的
    whoTurn.set(opponent) ;

因此,当我们使用Ref保持状态时,对Ref的访问会在事务中自动同步。

代理商

由于代理提供了不协调的异步访问,因此使用代理进行状态操纵将意味着我们需要等到所有更新都已应用到代理之后。 代理为获取提供非阻塞访问。

public class PingPong {Agent<String> whoseTurn;public PingPong(Agent<String> player) {whoseTurn = player;}public boolean hit(final String opponent) {final String x = Thread.currentThread().getName();wait till all the messages are processed to make you get the correct value, as updated to Agents areasyncString result = whoseTurn.await(new Timeout(5, SECONDS));if (x.compareTo(result) == 0) {System.out.println('PING! (' + x + ')');whoseTurn.send(opponent);} else {try {wait(2500);} catch (Exception e) {}}return true;  keep playing.}}

这里的关键是以下

  • 同步关键字丢失
  • 将状态变量定义为Agent
    //对Ref.View的更新是同步的
    Agent <string>其Turnn;
  • 等待对代理的更新,因为对代理的更新是异步的
    字符串结果= whoTurn.await(new Timeout(5,SECONDS));
  • 调用更新Ref是协调和同步的
    whoTurn.send(opponent) ;

这些示例中引用的所有代码都可以在– https://github.com/write2munish/Akka-Essentials/tree/master/AkkaSTMExample/src/main/java/org/akka/essentials/stm/pingpong中找到
示例1 –用于基于普通线程的同步
示例2 –使用Refs进行同步 示例3 –使用代理进行同步

参考:在Akka Essentials博客上,与我们的JCG合作伙伴 Munish K Gupta 一起使用STM玩 -Refs 和Agents 。


翻译自: https://www.javacodegeeks.com/2012/05/akka-stm-playing-pingpong-with-stm-refs.html

akka与neety

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

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

相关文章

怎样调用另一个html中的元素,html – 使用DIV作为另一个元素的背景

这里我用2个div做了一个例子&#xff1a;> .content,包含前端所需的一切> .background – 包含文本,图像和背景中的所有其他内容要将一个div包装在另一个div上(制作叠加层),你必须将它们放入相同的元素中,在本例中它是#wrapper div.放置位置&#xff1a;包装的相对宽度/高…

在running android lint期间发生了内部错误.,Eclipse出现quot;Running Android Lint has encountered a problemquot...

近期打开Eclipse的时候&#xff0c;总是发生这种一个错误&#xff1a;"Running Android Lint has encountered a problem"。截图例如以下&#xff1a;。可是Eclipse能够正常执行程序。不会造成其它影响。可是每次打开Eclipse时。总是看到这个警告&#xff0c;心情会非…

idea 导出war包_使用IDEA实现远程代码DEBUG调试教程详解

我们在使用 IDEA DEBUG调试代码的时候&#xff0c;常常见到控制台会输出一句这样的话&#xff1a;「Connected to the target VM, address: 127.0.0.1:62981, transport: socket」&#xff0c;所以即使代码不在本地运行&#xff0c;只要JVM打开调试模式&#xff0c;并且网络能够…

鸿蒙os2.0发布回放,华为HarmonyOS 2.0系统发布会内容大全 鸿蒙os6月2日直播回放地址入口...

华为鸿蒙os6月2日直播回放在哪里看&#xff1f;华为HarmonyOS 2系统发布会说了些啥&#xff1f;HarmonyOS 2系统在6月2日正式发布了&#xff0c;之前预约过的小伙伴现在就可以更新体验了&#xff0c;这次发布将会对安卓系统一个重大的革新&#xff0c;将会彻底颠覆之前的安卓系…

python中当地时间_R 与 Python 中与时间相关内容的梳理

约万字长文预警&#xff0c;如果你没时间&#xff0c;就不用看了&#xff0c;这就是一个梳理的文章&#xff0c;方便我后来找资料。因为工作的关系&#xff0c;近期需要梳理一些 Python 的知识(可能有小伙伴知道了&#xff0c;LI-6800 搞了个大动作&#xff0c;支持 Python 编程…

JavaOne 2015:为JDK 9做准备– blog @ CodeFX

JavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的&#xff0c;并且充满了宝贵的信息&#xff0c;我敦促每个Java开发人员都注意它们。 除此之外&#xff0c;我想给社区一种搜索和引用它们的方法&#xff0c;因此我在这里总结一下&…

华为oj----iNOC产品部-杨辉三角的变形 .

此题提供三种方法&#xff0c;第一种&#xff0c;一开始就能想到的&#xff0c;设置一个足够大的数组存储生成的杨辉三角&#xff0c;然后进行判断就行,此方法参见&#xff1a;华为oj iNOC产品部-杨辉三角的变形 另一种方法是采用递归&#xff1a; 三角形的每行的个数为2*n-1,n…

java 短路判断_java中和的区别(|和|同理)

在java的基础面试题中肯定有这个问题&#xff1a;&和&&的区别&#xff1f;这个问题很好回答&#xff0c;核心思想就是一个不短路一个短路的问题。首先说下&&#xff0c;1、它可以表示二进制中的位运算分析&#xff1a;二元操作符&#xff0c;操作两个二进制数据…

不属于计算机完成科学特点的是,2020年9月网络教育统考计算机应用基础模拟题试卷4...

2020年9月网络教育统考计算机应用基础模拟题试卷4一、单选题1.______是第四代计算机的典型代表。A.微型机B.超小型机C.巨型机D.大中型机答案&#xff1a;A2.个人计算机又称PC机&#xff0c;这种计算机属于______。A.微型计算机B.小型计算机C.超级计算机D.巨型计算机答案&#x…

苹果13系统锁屏延迟_iPhone 11 锁屏出现延迟是怎么回事?

正常情况下&#xff0c;按下 iPhone 电源键&#xff0c;屏幕会立即息灭&#xff0c;有不少用户反馈按下锁屏键后&#xff0c;会有片刻的延迟才能关屏&#xff0c;虽然延迟并不是很长&#xff0c;但会给人造成“卡顿”的假象。很多人把原因归结为 iOS 13 系统&#xff0c;其实并…

html中img引入git动画,用Github五万颗星的css动画库, 为网页增添趣味性

css动画可以做到什么程度?Github上有一个非常优秀的动画项目, 足足有5万颗星!在线效果展示:animate整个项目只有一个css文件, 使用方法也非常简单, 只要给相应的元素添加class属性即可通过悬浮产生动画的小DemoAnimate的动画展示body, html{margin: 0;padding: 0;}#title{marg…

JQuery------鼠标双击时,不选中div里面的文字

如图&#xff1a;(去掉选中文字的蓝色背景色) 代码: //方法一:<div class"test" onselectstart"return false" >文字</div> //方法二: .test{-moz-user-select:none;-webkit-user-select: none; -ms-user-select: none; } 转载于:h…

限制ul显示高度_HP Envy 34寸超宽曲屏 显示器评测

先上结论&#xff1a;这是我目前不换显卡的前提下&#xff0c;能买到最好的显示器。估计在今后很长时间&#xff0c;它也算是一个相当好的显示器。如果你对显示器要求比较高&#xff0c;那么买这个显示器应该没错。显示器的指标如下&#xff1a;对角线34寸。基本就和27的16&…

linux wenj 立即生效_【新书连载】测试工程师核心开发技术(3)—远程登录Linux系统...

1.3.3 在线帮助命令下面对常用的在线帮助命令进行介绍。1&#xff0e;man命令man命令的作用是查看联机手册&#xff0c;命令格式如下。man [选项] 命令名称man后面的参数的含义如表1-1所示。表1-1 man后面的参数的含义输入man数字命令/函数即可以查到相关的命令和函数。若man…

利用Python进行简单的图像识别(验证码)

这是一个最简单的图像识别&#xff0c;将图片加载后直接利用Python的一个识别引擎进行识别将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt文件中1 #-*-encoding:utf-8-*-2 import pytesseract3 from PIL import Image4 5 class GetImageDa…

北京人文计算机学院,北京人文大学计算机信息工程学院举行元旦晚会

2011年12月28日晚上8时许&#xff0c;北京人文大学第一阶梯教室座无虚席&#xff0c;计算机信息工程学院“2011年元旦晚会”在这里隆重举行。计算机信息工程学院副院长林月珍、喻新和&#xff0c;团委书记李四辈老师&#xff0c;学生处副处长肖淑芬老师&#xff0c;学生处副处长…

teamcity_TeamCity工件:HTTP,Ant,Gradle和Maven

teamcity您可以通过几种方式检索TeamCity工件&#xff1f; 我说有很多选择 &#xff01; 如果您使用的是Java构建工具&#xff0c;那么可以使用简单的HTTP请求&#xff0c;Ant Ivy&#xff0c;Gradle和Maven下载和使用TeamCity构建配置产生的二进制文件。 怎么样&#xff1f; …

arcgis双标准纬线等角圆锥投影_世界地图是怎么制作出来的,各投影算法的来历...

今天小编带大家了解一下下&#xff0c;目前通用的世界地图是怎样作出来的。一、通用的世界地图版本——“墨卡托投影”16世纪早期&#xff0c;正值大航海时代&#xff0c;航海家们发现很难将他们的航线画在图上&#xff0c;如何将球面上的一部分绘制在平面上&#xff0c;用直线…

计算机的iscsi配置,PC端的iSCSI参数设置方法

PC端的iSCSI参数设置方法上面介绍完NAS端的设置&#xff0c;接下来再来给大家介绍一下PC端的iSCSI设置&#xff0c;主要是实现在PC端上连接使用NAS上的iSCSI存储空间&#xff0c;这里我们以Windows 7 SP1系统为例(Windows8上的设置基本与之类似)。1.首先打开控制面板&#xff0…

纸筒制作机器人_5个万圣节小手工,带孩子一起动手制作,简单又有趣!

在西方国家&#xff0c;除了圣诞节&#xff0c;最受期待的节日莫过于是十月底的万圣节了&#xff0c;提起这个节日&#xff0c;这五大元素可以说是不错的体现&#xff1a;搞怪的南瓜、可爱的蜘蛛、萌萌哒蝙蝠、点睛之笔的蜡烛&#xff0c;以及可以用来迎客的门饰。今天我们就来…