将java maven项目中编写的模拟程序修改为可重启程序

将java maven项目中编写的模拟程序修改为可重启程序,java,performance,Java,Performance,我有一个用java-maven编写的模拟程序,我在集群机器上运行它,但是有一个时间限制。因此,理想情况下,我希望修改代码使其可重新启动(即,它能够在某一点停止并从该点重新启动),我以前从未这样做过,有人能给我一些提示,我应该遵循什么过程,这将不胜感激 我想到的第一件事是序列化对象模型。我的意思是,当你们开始你们的模拟时,首先,它寻找一个特殊的文件,它保存着你们整个对象树的序列化形式。如果有,它将反序列化它,并从那里继续。如果不是像往常一样启动,在停止之前,它会再次序列化其状态,写入该特殊文件,然

我有一个用java-maven编写的模拟程序,我在集群机器上运行它,但是有一个时间限制。因此,理想情况下,我希望修改代码使其可重新启动(即,它能够在某一点停止并从该点重新启动),我以前从未这样做过,有人能给我一些提示,我应该遵循什么过程,这将不胜感激

我想到的第一件事是序列化对象模型。我的意思是,当你们开始你们的模拟时,首先,它寻找一个特殊的文件,它保存着你们整个对象树的序列化形式。如果有,它将反序列化它,并从那里继续。如果不是像往常一样启动,在停止之前,它会再次序列化其状态,写入该特殊文件,然后退出


我希望这是有意义的。

在Java中,您可以注册一个关机钩子,在JVM即将退出时运行,可以通过“脱离”主方法正常退出,也可以通过一些外部信号(如
^C
或操作系统重新启动事件)退出

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        // Save program state for later
    }
});
好的,我已经提供了一个很好的答案,我在这个答案被接受后回答


我想到的第一件事是序列化对象模型。我 意思是,当你开始你的模拟,首先,它寻找一个 特殊文件,它保存整个对象树的序列化形式。 如果有,它将反序列化它,并从那里继续。如果不是 像往常一样启动,在停止之前,它再次序列化其状态, 写入那个特殊文件,然后退出

作为扩展,我想添加一些代码实现

您可以在组件中设计并实现一个有效的
init()->start()->stop()->destroy()
life。您可以让组件在
init()
中从现有转储初始化或加载数据,并在
stop()
函数中序列化状态

为了增加一些简单性,您可以有一个
Lifecycle
接口的基本实现,可以扩展到您的组件


其他参考资料:

如果不想修改代码,请在虚拟机中运行该代码,然后挂起/恢复虚拟机:这是一个太宽泛的话题。它基本上依赖于某种外部存储。我建议研究一下检查点的概念。这是指作业被终止还是只是在集群计算机上暂停?对不起,我只是不知道这件事。它暂停了。但并不是那么简单。根据模拟所需的资源,它在恢复后可能无法正常工作。最好让你的程序对一些关机信号做出反应。它肯定会的。作为扩展,他可以创建一个关闭钩子,并使用该线程序列化应用程序的状态。这是个好主意吗?听起来是个不错的增强。谢谢你的输入:)@Alp我隐约明白你的意思,所以我想我最新的问题是:如何找到你提到的这个序列化状态?它是否存储在某个特定目录下的文件中?如果没有,有什么方法可以获得它?@gavyllittlewolf我所做的是创建一个
生命周期
接口及其基本实现。也许你可以从中挽救一些东西,这样你就可以开始将你的对象序列化成一个文件…@GarryLittlewolf请寻找Java对象的序列化。这非常简单,特别是如果您不需要其他格式的序列化表单,如XML、JSON、GSON等。我认为您确实不需要XML等格式的序列化表单。因此,请坚持使用默认的二进制形式。让Java为您完成这项工作。您只需要知道您的“状态”(或当前对象模型)作为文件写入磁盘并读取。就这些。:)听起来不错。感谢您的改进:)@Alp谢谢:)如果您能为我的项目提供帮助,我将不胜感激D