优雅地停止正在运行的java程序

优雅地停止正在运行的java程序,java,linux,multithreading,Java,Linux,Multithreading,我一直在谷歌上搜索一种向运行中的Java程序发送命令的方法,但大多数帖子建议实现listener,或者用Jetty(或其他服务器)实现来包装程序 有没有一种方法可以在不添加其他依赖项的情况下实现这一点 这个场景是,我有一个Java程序,它将无限期地运行,并且会产生一些正在运行的线程。我希望能够运行一个脚本来停止它,当它需要关闭时,有点像关闭脚本服务器往往有。这将允许我在程序中处理关机过程。该程序在linux环境中运行 谢谢。实现了关机挂钩,到目前为止它看起来不错。实施守则: final Thre

我一直在谷歌上搜索一种向运行中的Java程序发送命令的方法,但大多数帖子建议实现
listener
,或者用
Jetty
(或其他服务器)实现来包装程序

有没有一种方法可以在不添加其他依赖项的情况下实现这一点

这个场景是,我有一个Java程序,它将无限期地运行,并且会产生一些正在运行的线程。我希望能够运行一个脚本来停止它,当它需要关闭时,有点像关闭脚本服务器往往有。这将允许我在程序中处理关机过程。该程序在linux环境中运行


谢谢。

实现了关机挂钩,到目前为止它看起来不错。实施守则:

final Thread mainThread = Thread.currentThread();
            Runtime.getRuntime().addShutdownHook(new Thread() {
                public void run() {
                    logger.info("Shut down detected. Setting isRunning to false.");

                    if(processors != null && !processors.isEmpty()){
                        for (Iterator<IProcessor> iterator = processors.iterator(); iterator.hasNext();) {
                            IProcessor iProcessor = (IProcessor) iterator.next();
                            iProcessor.setIsRunning(false);
                            try {
                                iProcessor.closeConnection();
                            } catch (SQLException e1) {
                                logger.error("Error closing connection",e1);
                            }
                        }
                    }
                    try {
                        mainThread.join();
                    } catch (InterruptedException e) {
                        logger.error("Error while joining mainthread to shutdown hook",e);
                    }
                }
            });
final Thread mainThread=Thread.currentThread();
Runtime.getRuntime().addShutdownHook(新线程(){
公开募捐{
logger.info(“检测到关闭。将isRunning设置为false”);
if(processors!=null&&!processors.isEmpty()){
for(迭代器迭代器=处理器。迭代器();迭代器。hasNext();){
IProcessor IProcessor=(IProcessor)迭代器.next();
iProcessor.setIsRunning(false);
试一试{
iProcessor.closeConnection();
}捕获(SQLException e1){
记录器错误(“错误关闭连接”,e1);
}
}
}
试一试{
mainThread.join();
}捕捉(中断异常e){
logger.error(“将主线程连接到关机挂钩时出错”,e);
}
}
});

谢谢你的建议。

你的意思是通过编程还是仅仅从consley你可以使用
套接字
与我们沟通流程,但这假设流程正在侦听,或者可能正在向流程正在监控的特定文件写入值……这个答案可能会有所帮助:只需实现一个关闭挂钩,无论何时你想停止进程,只要使用术语signal:kill-TERM java_proccess_id谢谢你提供了到shutdown hook的链接,我会研究它?