【问题标题】:How do you gracefully exit a Process in Java?如何优雅地退出 Java 中的进程?
【发布时间】:2012-01-07 04:18:21
【问题描述】:

我正在尝试制作一个 Java 程序,它将运行其他几个不相关的 Java 程序,特别是 Minecraft 服务器。 目前,我正在尝试研究如何优雅地结束 java.lang.Process。

这是我的 spawner 程序的代码: http://dl.dropbox.com/u/26746878/SpawnerSource/Main.java.txt

这是生成的程序的代码: http://dl.dropbox.com/u/26746878/SpawnerSource/Tester.java.txt

我要做的是运行我的 spawner 程序。然后,几秒钟后,我用 Ctrl-C 终止它。 我想看到的是我的程序输出“关闭”,然后是“结束”。我还想查看文件“test.txt”。 我实际看到的只是“Shutting Down”,没有“Ending”也没有“test.txt”

我认为问题在于 Process.destroy() 是在不让关闭挂钩运行的情况下强行结束进程。

是否有替代 Process.destroy() 的方法可以优雅地退出进程(即:就像我按下了 Ctrl-C 一样)?

【问题讨论】:

  • 是否有使用 Java 执行此任务的特定理由,而不是 shell 脚本/批处理文件?
  • @MarkPeters 我希望最终让这个程序监听一个特定的端口,并让一个 PHP 脚本连接到它,并让程序在生成的进程上执行命令,我更愿意使用 Java这比什么都重要。
  • 所以,因为您对 Java 很熟悉,不管它是否是适合这项工作的工具? Java 没有非常丰富的进程管理支持。
  • @AVD:完全不同。这个问题是关于从 Java 内部关闭外部进程,这个问题是关于从外部进程发送信号时优雅地关闭。

标签: java windows multithreading


【解决方案1】:

您永远不应该破坏工作进程,因为它可能会使整个操作系统进入不稳定状态(相信我,这导致我们停机 2 小时,并为我的公司损失 10000 美元 :( ) 你应该做的是正如@Kane 提到的那样,向所有子进程发送关闭请求并等待它们全部完成(每个子进程在正常退出之前将 RMI 通知发送回主进程)

class ParentProcess{
  Map<int, CountDownLatch> finishSignals = new ConcurrentHashMap<int, CountDownLatch>();
  public void startProcess(){
    // Start child process
    // get its ID
    // and create a count down latch for it
    finishSignals.add(processId, new CountDownLatch(1));
  }
  public void shutDownProcess(processId){
    // Send an RMI request to process ID to shutdown
  }
  // RMI request sent from child process before stopping
  public void processFinishedNotification(processId){
    finishSignals[processId].countDown()
  }
  public void waitForChildsToFinish(){
    // This for loop will block until all child processes have sent a finish notification
    for(CountDownLatch childFinishSignal : finishSignals){
      childFinishSignal.await();
    }
  }
}

【讨论】:

  • 谢谢。我希望有更多的“process.stop”类型的解决方案,但是好吧。也感谢您的代码。
【解决方案2】:

您可能希望查看远程方法调用,并让您的 spawner 进程要求子进程自行关闭,而不是让 spawner 进程自行杀死子进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2011-10-20
    • 1970-01-01
    • 2013-07-21
    • 2011-01-21
    相关资源
    最近更新 更多