我对优雅地关闭Java命令行程序的不同方法感兴趣.发送终止信号不是一种选择.
我可以想到几种不同的方法.
第三个是不理想的,因为经常将程序输出泵送到屏幕.第一个需要付出太多努力(我很懒).大多数程序员使用第二种选择吗?如果没有,还有什么可能/优雅/简单?
我在类似于kiosk的环境中运行Chromium,如果计算机在Chromium运行时强行关闭电源,则下次启动它时将显示消息"Chromium未正确关闭.要重新打开已打开的页面,单击"恢复".
我已经尝试在〜/ .config/chromium目录中保存一些文件,并在铬加载之前替换它们,但它似乎没有帮助.我不能替换整个文件夹,因为我需要保持本地存储和cookie正常工作.
我想要隐藏此消息,检查它是否存在并将其删除,或者首先阻止它被触发.
有什么建议吗?!
我有一个程序在关机期间遇到了一些麻烦,引发了我无法追溯到其来源的异常.它似乎与时间相关且不确定.这是在所有共享资源被释放后发生的,并且由于它已经关闭,因此内存泄漏不是问题,所以这让我想知道是否有任何方法只是告诉程序在释放共享资源后立即和静默终止,而不是继续关闭序列并给出一个异常消息框.
有谁知道这是怎么做到的吗?
我正在寻找关闭OSGi容器的最佳实践.
目前我们正在使用一个小型启动器应用程序,它调用EclipseStarter.startup()并安装一些核心软件包.之后发射器终止.
当测试GUI(作为一个捆绑包运行)关闭时,它调用System.exit(0)来关闭容器,但必须有一个比这更优雅的解决方案.
谢谢
更新:为了便于阅读,以下是在反应器关闭之前添加回调的方法:
reactor.addSystemEventTrigger('before', 'shutdown', callable)
Run Code Online (Sandbox Code Playgroud)
原始问题如下.
如果我有一个连接到服务器的客户端,并且它在反应器主循环中等待事件的冷却,当我按下CTRL-C时,我得到一个"以另一方面的连接以非干净的方式丢失:连接丢失. " 如何设置它以便我知道何时发生KeyboardInterrupt,以便我可以进行适当的清理并彻底断开连接?或者,如果可能的话,如何实现更清晰的关闭方式,不涉及CTRL-C?
执行"grails run-app"后,除了使用"Ctrl + C"外,是否有关闭它的命令?
你可以发布一个简单的代码来处理关闭事件.我需要清单和接收器.
我需要以下内容:我有一个在后台运行的服务,我想检测手机关闭,以使其处于静音模式,这样就不会播放可怕的操作员音乐.
重新启动手机后(我已经在启动接收器上),该服务将启用手机声音.
我们的maven构建在jetty关闭的构建结束时抛出一个我不明白的NoClassDefFoundError.有没有人知道这是从哪里来的,以及如何解决它?
以下是pom文件中的依赖项:
<dependencies>
<dependency>
<groupId>com.restfuse</groupId>
<artifactId>com.eclipsesource.restfuse</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert</artifactId>
<version>1.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.pe-international</groupId>
<artifactId>bom.model</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>rest-assured</artifactId>
<version>2.3.4</version>
</dependency>
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>json-path</artifactId>
<version>2.3.4</version>
</dependency>
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>xml-path</artifactId>
<version>2.3.4</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
Jetty conf:
<!-- Start Jetty -->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.2.v20140723</version>
<configuration>
<war>${basedir}/target/bla.war</war>
<httpConnector>
<port>8088</port>
</httpConnector>
<webApp>
<contextPath>/bla</contextPath>
</webApp>
<systemProperties>
<systemProperty>
<name>config.dir</name>
<value>${basedir}/target/config.dir</value>
</systemProperty>
</systemProperties>
<stopKey>fooStopBla</stopKey>
<stopPort>8089</stopPort>
</configuration>
<executions>
<execution>
<id>start-jetty</id>
<phase>process-test-resources</phase>
<goals>
<goal>deploy-war</goal>
</goals> …
Run Code Online (Sandbox Code Playgroud) 可能重复:
Windows Phone 7关闭应用程序
如何以编程方式关闭WP7应用程序?
当JVM终止与发生什么System.exit(0)
或^C
或那样的东西吗?我读过"过程刚被吹走"和"每一个线程都被停止"之类的东西,但我想知道究竟发生了什么.我已经知道shutdownHook
有些东西仍然会被执行,但是在调用shutdownHooks之前会发生什么,并且在所有这些线程完成之后会发生什么?
我想shutdownHook
正确地实现这样一个并且这样做,我需要对可能仍然执行什么和不执行什么做出正确的假设.
一些代码:
class SomeObject {
private boolean stopped;
SomeObject() {
stopped = false;
Thread hook = new Thread() {
@Override
public void run() {
stopped = true;
}
};
hook.setPriority(Thread.MAX_PRIORITY);
Runtime.getRuntime().addShutdownHook(hook);
}
boolean map(Iterator<Object> it) {
while(it.hasNext() && !stopped) {
writeToOtherObject(it.next());
it.remove();
}
//have calculations finished?
return !it.hasNext();
}
}
Run Code Online (Sandbox Code Playgroud)
该map
函数计算在其他对象中收集的结果.在所有内容都被分解之前,该对象应该存储在某个文件中(也可以是普通优先级shutdownHook
).请问shutdownHook
这里有意义吗?据我所知,所有线程首先被销毁,然后shutdownHook
才运行(同时,但我假设首先运行高优先级线程......)然后最终确定对象.这使得上面的代码相当无用,因为这样做的目的是shutdownHook
确保在关闭已经开始时没有启动新的循环.我的理解是正确和完整的吗?