我们正在做一些原型设计工作,我们想知道是否有可能中断执行RMI调用的线程.如果我们在这个线程上调用interrupt(),它会抛出InterruptedException吗?(或应该?)我们的测试目前显示它没有.只是想知道它应该如何.
Interruptible RMI 库提供了一种中断 RMI 调用的机制。通常,当线程调用 RMI 方法时,线程会阻塞,直到 RMI 方法返回。如果方法调用花费的时间太长(例如,如果 RMI 服务器繁忙或挂起,或者用户想要取消 RMI 操作),则没有简单的方法可以中断阻塞的 RMI 调用并将控制权返回给 RMI 线程。可中断 RMI 库提供了此功能。
该库由两个关键组件组成:RMISocketFactory 和 ThreadFactory。使用 RMISocketFactory 中的套接字在线程上从提供的 ThreadFactory 到 RMI 接口进行的 RMI 调用可以通过在客户端线程上调用 Thread#interrupt() 来中断。所以,它真的很容易使用。但还要注意,在服务器端,您可能希望添加对方便的实用程序方法的调用,以确保当前线程不是已被客户端“中断”的“僵尸”或孤立线程。
以编程方式停止 RMI 服务器:
RMI 服务器启动一个永不结束的线程。这样服务器就可以持续存在,直到手动关闭为止。shutDown()但是,您可以为远程服务器提供远程方法。该方法启动一个关闭线程。关闭线程保持等待,notify(). 当服务器完成所有清理处理时,它会唤醒关闭线程。
关闭线程在两 (2) 秒延迟后,调用System.exit(0)以结束 Java 虚拟机。延迟是为了使消息从服务器到发起客户端完成整个旅程。