我正在实现类似数据库之类的东西,其中对数据操作语句(插入,更新和删除)进行了评估。有些语句可以并发执行,而另一些则不能(我计算得出)。我喜欢RMI的易用性和便利性,但是我需要对带有多线程的RMI服务实现有更深入的了解。例如,
例如,如果在每个调用上创建了一个线程,那么我可以使用java join方法对语句执行进行排序。另一方面,如果使用线程池,则join方法将不起作用(因为线程不会终止)。
最佳答案
概述
这篇文章中似乎存在一些问题,因此,我将尝试详细介绍每个部分。
问题1-可以以任何方式控制多线程吗?
是的!您对多线程的实现可以是您想要的任何形式。 RMI实现只是具有足够抽象性的独立JVM之间的通信,以使其感觉像它们存在于1个JVM上。因此对多线程没有影响,因为它只是通信层。
问题2-是为每个远程调用(在服务器端)创建线程还是使用线程池?
请参阅文档here。如果它们在不同的线程上,简短的答案是“否”。
A method dispatched by the RMI runtime to a remote object implementation may or may not execute in a separate thread. The RMI runtime makes no guarantees with respect to mapping remote object invocations to threads. Since remote method invocation on the same remote object may execute concurrently, a remote object implementation needs to make sure its implementation is thread-safe.
使用线程池的RMI取决于实现,但是作为使用RMI的开发人员,这并不重要,因为它封装在RMI连接层中。
问题3-使用RMI,如何确保某些RMI调用等待其他调用终止?
这是一个相当模糊的问题,但是我认为您的问题是在RMI中进行同步时如何正确阻止。这是与您的应用程序设计一起提供的。让我们以您尝试访问数据库并且必须同步数据库访问的情况为例。如果客户端尝试通过RMI调用访问,则它将调用保存所有同步的远程服务器的方法,因此必须等待锁定。因此,客户端将等待轮到它通过服务器访问数据库。因此,在当前情况下,您希望数据库的同步出现在服务器端上。
问题4-是否有另一种非RMI方法,其便利性和效率相同,因此更适合于此?
绝对地。以下是可用于通信的通信实现的简要列表。
1)RESTful
2)RMI
3) socket
4)gRPC
我的建议是使用RESTful,因为它是最简单的方法,并且在Internet上具有大量实现/文档。效率似乎是您高度关注的问题,但是您的操作仅以标准方式操作数据库。因此,我相信Restful实现将提供足够的效率。
这样想吧;您有N个客户端,一个负载均衡器和M个服务器。客户端和服务器之间不存在持续的连接,因此降低了复杂性和计算量。随着N个客户端的增长,负载平衡器将创建更多服务器实例并适本地分配负载。注意,客户端和服务器之间的请求实际上很小,因为它们将具有有效负载和请求类型。此外,服务器将正常接收并并行接收请求并计算操作。可以通过线程池或诸如spring之类的框架在服务器端进行优化。
关于java - Java RMI和高级多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52027159/