我有一个关于从一个线程调用一个远程对象的问题:当我的线程呈现无响应时会发生什么,因为它已经阻塞了对似乎进入无限循环的服务器的调用?
当前线程等待先前已经启动的通道的顾问(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。