【发布时间】:2019-02-01 06:35:19
【问题描述】:
我正在实现类似于数据库的东西,其中数据操作语句(插入、更新和删除)得到评估。有些语句可以同时执行,而另一些则不能(我计算得出)。我喜欢 RMI 的易用性和便利性,但是我需要更深入地了解 RMI 服务实现 w.r.t 多线程。例如,
可以以任何方式控制多线程吗?
是为每个远程调用创建一个线程(在服务器端)还是使用了线程池?
更一般地说,使用 RMI,如何确保某些 rmi 调用等待其他调用终止?
是否有另一种非 RMI 方法,具有相同的便利性和效率,可以更好地解决这个问题?
如果我想要多线程,我应该自己在服务器端代码上创建线程吗?担心的是,如果 RMI 服务创建了多个线程,那么我将添加额外的不必要的线程。
例如,如果每次调用都创建一个线程,那么我可以使用 java join 方法来命令语句执行。另一方面,如果使用线程池,则 join 方法将不起作用(因为线程不会终止)。
【问题讨论】:
-
RMI 是一个通信层,本质上与线程无关。每次调用是否使用新线程或池线程完全取决于 RMI 实现。我认为参考实现是前者。无论如何,像
java.util.concurrent这样好的线程池实现会通知您线程任务完成,通常通过Executable或Future接口或类似接口。最后但并非最不重要的一点是,我建议避免使用 RMI,因为它是一种非常过时的技术,而是使用更现代的东西,例如 RESTful Web 服务。 -
@sparc_spread 如果 RMI 没有指定或允许控制服务器端的多线程,那么它似乎不适合上面的 DML 应用程序,因为我想要并发。换句话说,同时处理调用很重要。
-
如果你想控制并发,控制它。使用
synchronized关键字或信号量。没有奥秘。在最简单的层面上,将您的远程方法设为synchronized。 -
1.没有。 2.这与你的问题无关。 3. 同上。 4. 不,它已经是多线程的了。您所要做的就是确保在服务器端进行适当的同步。 RMI 的单线程实现在理论上是可能的,但它完全没用,而且它们不存在。
标签: java multithreading rmi