理论教育 Scala:Actor消息接收实战场景

Scala:Actor消息接收实战场景

时间:2023-11-24 理论教育 版权反馈
【摘要】:自定义的Actor能够通过基于Actor的标准接收操作来取回Future的结果,使得Future实例在Actor上下文中变得特殊。如果邮箱中没有让isDefinedAt方法返回true的消息,则被调用的Actor将会阻塞,直到收到匹配的消息。Actor发送和接收消息示例。在例9-5中的self即代表当前的main线程,此时main线程被当成Actor来使用。self向accumulator发送消息,accumulator收到消息匹配样本进行计算,最后receive方法收到并打印出计算结果。

Scala:Actor消息接收实战场景

自定义的Actor能够通过基于Actor的标准接收操作(例如receive方法等)来取回Future的结果,使得Future实例在Actor上下文中变得特殊。此外,还可以通过使用基于事件的操作(react方法和reactWithin方法),这使得一个Actor实例在等待一个Future实例结果时不用阻塞它的底层线程

receive方法将选定邮箱中第一个让isDefiendAt返回true的消息,将这个消息传递给偏函数的apply方法,apply方法将具体处理这个消息。如果邮箱中没有让isDefinedAt方法返回true的消息,则被调用的Actor将会阻塞,直到收到匹配的消息。例9-5为通过!发送消息和通过receive接收匹配消息进行处理的示例。

【例9-5】Actor发送和接收消息示例。

978-7-111-54169-1-Chapter09-11.jpg

执行结果如图9-6所示。

978-7-111-54169-1-Chapter09-12.jpg(www.daowen.com)

图9-6 向Actor发送数字等待计算结果

在例9-5中,在main方法里使用actor工具方法构建了一个Actor实例,该实例在构建好的时候就立即执行reactWithin方法,reactWithin将会在一定的terminal时间内查看自己的邮箱,匹配每一个case分支,然后进行相应的逻辑处理。

Actor子系统会管理一个或多个原生线程供自己使用,只要使用Actor,就不需要关心它们和线程之间的对应关系是怎样的。该子系统也支持反过来的情形:即每个原生线程也可以被当作Actor来使用,不过不能直接使用Thread.current,因为它不具有必要的方法。应该使用Actor.self来将当前线程当作Actor来看待。

在例9-5中的self即代表当前的main线程,此时main线程被当成Actor来使用。self向accumulator发送消息,accumulator收到消息匹配样本进行计算,最后receive方法收到并打印出计算结果。由于receive在没有匹配到消息的时候将会阻塞,因此在这里使用receive⁃Within方法指定一个以毫秒记的超时时限。为了节约线程的创建和切换,Scala提供了另外一个方法react,用来提高性能。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈