java - Java RMI和高级多线程

标签 java multithreading rmi

我正在实现类似数据库之类的东西,其中对数据操作语句(插入,更新和删除)进行了评估。有些语句可以并发执行,而另一些则不能(我计算得出)。我喜欢RMI的易用性和便利性,但是我需要对带有多线程的RMI服务实现有更深入的了解。例如,

  • 可以通过任何方式控制多线程吗?
  • 是为每个远程调用(在服务器端)创建一个线程还是使用了线程池?
  • 更一般而言,如何使用RMI确保某些rmi调用等待其他调用终止?
  • 是否还有另一种非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/

    相关文章:

    java - 在java中加密和解密字符串

    python - 如何使用 while 循环对 Flask 应用程序和函数进行线程化以同时运行?

    c - 为什么 fscanf 在多线程读取时失败?

    java - 当我尝试运行我的程序时出现 Ant 错误

    java - RMI 和普通对象序列化之间有区别吗?

    java - 动态创建新的滚动文件 LOG4j2 2.6

    java - JFrame 的比例调整大小

    java - 如何仅检索从 Cassandra 更改的信息?

    c - 初始化线程池

    java - 在 NetBeans 中运行客户端项目时出现访问被拒绝 ("java.net.SocketPermission"错误