正如上面的标题所示,我想知道是否有任何方法暂停一个java应用程序或作为服务器上的守护程序运行的JVM,然后在以后重新启动它。我有一个应用程序运行长的过程,可能需要一个星期才能完成,使得很难对系统的其他部分执行任何维护。
答案 0 :(得分:1)
如果代码在您的控制之下,那么您可以考虑代码中的一些内部机制来暂停您的线程。像PausableThread之类的东西值得一试。
这样做的好处是可以控制暂停时机器处于什么状态。您可以确保仅在文件关闭或数据库查询完成时检查暂停。
答案 1 :(得分:1)
您可能需要查看java.io.Serializable
,它允许您从运行时保存对象,甚至完全停止应用程序。然后,您可以稍后重新启动该应用程序。
答案 2 :(得分:0)
这可以通过各种方式完成,但这种方法很大程度上取决于您的流程所做的工作。例如如果它做了大量相似的小工作,或小单位或工作:
while(PendingJobs > 0){
work(job);
removeFromPendingQueue(job);
//implement a pause signal check
while(pauseFlag){
Thread.sleep(10000);
}
}
在这种情况下,你可以通过一些url调用设置暂停标志,或者在IO上设置阻塞(例如存在锁定文件等)。因此,当pauseFlag设置为true时,该过程将完成当前作业并在占用下一个作业之前暂停。
但是,如果您的流程执行一个冗长的工作,那么这个工作本身会持续多天/几周。有几吨你需要担心:例如事务管理,连接超时,保留状态和从您离开的地方恢复等等。
无论哪种情况,应用程序都必须进行增强和设计。
答案 3 :(得分:0)
最佳解决方案是频繁使用Thread.yield(),并降低线程优先级Thread.setPriority()。 yield()的作用是说“如果其他进程需要它,我会放弃我的cpu时间段”,这样即使进程仍在运行,你也可以使用该机器,但它可能会影响性能。
如果你想完全暂停处理,只要你想要一个带有布尔值的简单condition,每个线程都会锁定并检查一个布尔暂停是否为真每个 N 次迭代,如果它们等待条件,如果它们不是它们解锁并且一如既往地继续。在您刚刚锁定的控制器线程上,将暂停设置为true,然后解锁,当您想要恢复处理时可以锁定,将暂停设置为false,使用{ {3}},然后解锁。
您也可以尝试使用Condition.signalAll()更改优先级,即使通常它们没有太大变化(仅限cpu使用调度,它们对i / o调度没有太大影响)
如果你想完全停止进程并恢复它,最好的方法是使用nice序列化所有上下文(有很多库),将其写入磁盘并反序列化当您重新启动应用程序时。