Java RMI在调用存根上的函数时冻结 总结
我正在进行一个项目,发现了以下问题: 我们在代码中发现了一个无法解决的问题。 首先,我们给出一些关于Eclipse项目的一般信息以及如何执行它,然后给出一些关于代码的详细信息,最后描述问题 项目 我们在Eclipse中构建了一个JavaMaven项目。它包含两个源文件夹:src/main/java和src/test/java。主文件夹包含Gallager、Humblet和Spira算法的实现。现在,我们有一个测试SimpleTest,看看算法的基本功能是否如预期的那样工作。 代码可以按如下方式执行:Java RMI在调用存根上的函数时冻结 总结,java,maven,rmi,freeze,Java,Maven,Rmi,Freeze,我正在进行一个项目,发现了以下问题: 我们在代码中发现了一个无法解决的问题。 首先,我们给出一些关于Eclipse项目的一般信息以及如何执行它,然后给出一些关于代码的详细信息,最后描述问题 项目 我们在Eclipse中构建了一个JavaMaven项目。它包含两个源文件夹:src/main/java和src/test/java。主文件夹包含Gallager、Humblet和Spira算法的实现。现在,我们有一个测试SimpleTest,看看算法的基本功能是否如预期的那样工作。 代码可以按如下方式执
((IProcess)this.lookup(id)).receive(edge,message)代码>远程网络r:52
为了了解实际问题是什么,我们在函数中添加了一些测试代码。
在第49行,我们添加了:IProcess p=(IProcess)this.lookup(id)代码>
第50行:String s=p.id()代码>
第51行:System.out.println(“网络”)代码>
使用此测试代码,在第50行启用Java Stuck
当第50行被禁用时,将执行第51行,Java将在第52行停止
p.id()函数在进程中实现。第一条语句将字符串打印到命令行。在Java停止时,不会执行这个print语句
当我们用49替换第49行时,我们添加了:IProcess p=(IProcess)this.lookup(edge.nexter(id))代码>(发送者现在实际上正在查找自己的id),然后在发送第二条而不是第三条消息时出现问题
因此,JavaRMI似乎在存根上的调用中冻结。但它始终适用于第一条消息,并根据第49行的不同,适用于第二条消息。因为没有抛出错误,我们不知道为什么RMI在这一点上冻结
@Override
public void send(String id, Edge edge, IMessage message) throws Exception {
System.out.println("testing");
IProcess p = (IProcess) this.lookup(id);
String s = p.id();
//System.out.println(((IProcess) this.lookup(id)).id());
System.out.println("networking");
((IProcess) this.lookup(id)).receive(edge, message);
System.out.println("id found");
}
我们希望你能帮助我们
您可以查看上的所有代码:您调用的远程方法没有返回。结果表明,进程在单个线程中相互等待。向其他进程发送消息的旧启动方法尚未完成,此时另一个进程通过存根调用方法。只要旧方法正在运行,这些方法就不会启动。因为旧方法正在等待响应(只有当这些旧方法完成时才会出现响应),所以系统最终陷入死锁。我们通过在新线程中执行节点的receive方法解决了这个问题。在本例中,Java冻结在String s=p.id()上代码>,它应该返回进程的id(参见第66行)。因此,我不知道你的意思。您是否认为发生了一些意外的行为导致id()函数不返回?在您的问题中,它并不是说您被冻结了,但是无论您调用什么,它都不会返回,正如我已经说过的那样。注意:我终于明白了,当你说“行”时,你的意思是“行”。不要误用标准术语。嗯,好的。关于术语我很抱歉:)谢谢你的回答。