我们有一个用Java编写的RMI客户端应用程序,需要定期向服务器应用程序发送“保持活动”消息.我们已经将它实现为一个单独的心跳线程,它将保持活动消息发送到服务器,然后使用Thread.sleep()休眠15秒.
线程设置为高优先级:
Thread heartbeatThread = new Thread(new HeartbeatRunnable(server));
heartbeatThread.setPriority(Thread.MAX_PRIORITY);
heartbeatThread.start();
但是,当运行客户端的框使用大量CPU时,我们发现错过了心跳,这导致服务器认为我们的客户端应用程序已经死亡.
我们在我的主线程中添加了Thread.yield()调用,尽管这并没有使问题消失.
有什么方法可以保证在我的应用程序仍在运行时按时发送心跳?
解决方法:
您可以通过在代码中*散布自编“yield”函数,在非线程环境中实现用户模式线程.
同样,您可以在代码中*分散心跳检查函数调用.放弃线程,只需定期调用心跳功能,检查是否需要发送心跳.
这是一个粗糙的解决方案,但鉴于你已经尝试了正确的解决方案并且它不起作用,也许这是你必须回归的东西.
实际上你可以做的是在每个函数调用的开头放置一个宏,它会快速检查时间并在必要时调用心跳功能.
(啊,你有Java的宏吗?我想不是 – 但你明白了).