理论教育 使用React重用线程提升性能-实际效果解析

使用React重用线程提升性能-实际效果解析

时间:2023-11-24 理论教育 版权反馈
【摘要】:Scala的Actor系统同样提供了react方法。不同的是react在找到并处理消息后并不返回。例9-6是一个使用react的示例。图9-7act方法中调用react方法重用线程程序中的act方法,在计算完成之后将退出,为了让act保持运行不退出可以使用Loop,在Actor库中,Loop用来重复执行一个代码块。从执行的结果可以验证,react方法在执行完成之后会释放线程,供其他Actor使用,要再次执行,需重新获取线程,这是react方法复用线程以提升性能的关键。

使用React重用线程提升性能-实际效果解析

在9.4一节中提到receive方法会一直阻塞,直到消息的到来。然而Actor是构建在普通的Java线程之上的,每一个Actor都要得到自己的线程,这样act方法才有机会执行。

Scala的Actor系统同样提供了react方法。和receive方法一样,react方法也是一个偏函数。不同的是react在找到并处理消息后并不返回。它的返回类型是Nothing,由于react不需要返回,因此不需要保存当前线程的调用栈,而将线程的资源释放以供另一个Actor使用。如果程序中的每一个Actor都使用react,而不是使用receive方法,理论上只需要一个线程就能满足程序全部Actor的需要。例9-6是一个使用react的示例。

【例9-6】react的使用示例。

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

运行效果如图9-7所示。

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

图9-7 act方法中调用react方法重用线程

程序中的act方法,在计算完成之后将退出,为了让act保持运行不退出可以使用Loop,在Actor库中,Loop用来重复执行一个代码块。为了看到loop代码块中的确是重复执行,并看清楚每次react方法执行完成之后释放线程,这里使用println打印出当前执行的线程的编号。重写后的代码如例9-7所示。重写后的代码如例9-7所示。(www.daowen.com)

【例9-7】act方法中使用Loop示例。

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

运行结果如图9-8所示。

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

图9-8 在loop块中运行代码

从执行的结果分析,Demo启动时,执行act方法的线程编号是14,当向Demo这个Actor发送数字“7”时,act方法中的react偏函数接收并匹配打印出数字“7”的平方,这时执行的线程编号是11。再次发送“Demo”字符串,打印出“not a Integer”信息,此时执行的线程编号是15。从执行的结果可以验证,react方法在执行完成之后会释放线程,供其他Actor使用,要再次执行,需重新获取线程,这是react方法复用线程以提升性能的关键

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

我要反馈