【问题标题】:Pausing program until next startup暂停程序直到下次启动
【发布时间】:2015-01-11 19:41:55
【问题描述】:

我有一个强制执行 AES256 加密的程序,当计算机进入关机/或重新启动时如何暂停该程序并在同一点继续直到系统下次启动?

程序的一种休眠。

【问题讨论】:

  • 您必须将程序的状态写入磁盘。 (与算法进度相关的所有变量的内容。)然后在重新启动程序后将这些值加载回变量中。

标签: java hibernation


【解决方案1】:

我同意@Thufir 回答的第 2 部分和第 3 部分,但关于第 1 部分,它假定您正在运行 GUI。

我会在 JVM 中添加一个 shutdown hook 并在此时写入我的程序的状态,而不是这个。您可以使用以下方法执行此操作:

Runtime.getRuntime().addShutdownHook(new Thread() {
   public void run() {
       // your serialization code goes here
   }
});

【讨论】:

  • 你对这个钩子有什么体验?我似乎遇到了它不执行的情况。
  • 我在生产系统中使用它来控制系统关闭;你能详细说明什么时候你看不到它工作吗?
  • 我知道的唯一问题是 SIGKILL 与 SIGTERM 之间的行为差​​异,但 SIGKILL 与基于窗口的版本存在相同的问题 - 操作系统很难杀死你的过程,所以无论如何,所有的赌注都是关闭的。解决此问题的唯一方法是定期写出您的应用程序状态并从该点恢复
  • 嗯,这确实是最后一个。你给了我一个很好的想法,现在谢谢你。
【解决方案2】:

你在这里问了三件事。

1- 如何检查操作系统何时重新启动/关闭

解决方案: 您可以制作一个空的不可见窗口,并将 WindowListener 添加到其中。它将在 windows 上接收 windowClosing 事件。

你可以找到一个例子HERE

2- 如何保存 BruteForce 进程的状态并在系统启动时暂停以重新启动。

解决方案: 这里很简单,你必须序列化。当系统再次启动时,这些将保存您的类/类的状态以反序列化。你可以学习HERE

3- OS UP 时如何知道何时再次启动程序?

解决方案: 您可以将程序置于操作系统的初始化过程中。当它启动时,您检查是否有任何要反序列化的内容并执行此操作,从而恢复 BruteForce 的过程。

【讨论】:

  • 正如代码牧场中解决方案1的链接中的一个人所说;关闭挂钩可能无法作为检查操作系统何时关闭的解决方案
  • 这将取决于操作系统,此外,如果未调用关闭挂钩,如果关闭窗口事件 /does/ 发生,我会感到惊讶
猜你喜欢
  • 2015-02-25
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2021-01-20
  • 1970-01-01
  • 2017-10-27
相关资源
最近更新 更多