我正在尝试制作一个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来终止它。 我想看到的是我的节目输出“closures”,然后是“结束”。 我也想看到一个文件'test.txt'。 我真正看到的只是“closures”,没有“结束”和“test.txt”
我相信问题是Process.destroy()强制结束进程而不让closures挂钩运行。
是否有一个替代Process.destroy()将优雅地退出该过程(即:如果我按Ctrl-C)?
你不应该破坏一个工作过程,因为它可能使整个操作系统进入不稳定的状态(相信我,这导致我们2小时的停机时间,并花费10000美元给我的公司:()你应该做什么,而不是像@凯恩提到的,发送一个关闭请求给你的所有子进程,并等待它们全部完成(每个子进程在正常退出之前将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(); } } }
您可能需要查看远程方法调用,并让您的spawner进程请求子进程关闭自己,而不是让spawner进程自己终止子进程。