当RMI呼叫没有响应时,我的线程会发生什么?

时间:2016-06-05 11:47:25

标签: java multithreading rmi

我有一个关于从一个线程调用一个远程对象的问题:当我的线程呈现无响应时会发生什么,因为它已经阻塞了对似乎进入无限循环的服务器的调用?

当前线程等待先前已经启动的通道的顾问(ChannelAdviser)线程的预定时间长度。我这样做是通过检索线程并通过超时调用join操作:

ChannelAdviser ca=receiver.getChannelAdviser();
if(ca==null){
    // Throw bespoke exception.
}

try{
    ca.join(receiver.getDrive().getCycleInterval());
}catch(InterruptedException ex){
    // Throw bespoke exception.
}

if(!ca.isAlive()){
    // All is good.
}else{
    /**
     *TODO Consider how one stops a channel adviser if the server
     * goes into an infinite loop while processing the message sent to it
     * by the given channel adviser. Does the adviser become a zombie
     * thread? Is this a potential memory leak as zombie threads
     * accumulate? How can the channel adviser be stopped so that should
     * the server be contacted again, and the same thing happens, there
     * is no risk of zombie channel advisers accumulating without limit?
     */
}

正如评论指出的那样,我相信当前的线程可以从服务器似乎进入无限循环的事实中恢复。但是,我想知道频道的顾问线程会发生什么。如果服务器一直在运行,这个线程会永远阻塞吗?

如果这是真的,那么显然是不可接受的。有没有办法从RMI客户端的潜在无限睡眠中唤醒渠道顾问,以便它有机会终止因此释放JVM资源?

编辑:这里没有公开调用远程对象的代码 - 假设通道的顾问线程负责进行调用,因此,如果它被阻止,它将在此RMI调用中被阻止。 / p>

感谢您的回答......

欧文。

PS编辑:我会接受这个问题是重复的,如果建议的答案集提供了一个解决方案,允许我动态地在我的客户端设置超时,并允许我创建多个超时取决于哪个正在调用服务器。第二个答案:RMISocketFactory表明这确实可以做到。所以,在实际发现我的假设是真的之前,我认为我的问题是重复的。

再次感谢您的帮助(在我即将发现之前)EJP。

0 个答案:

没有答案