可能重复:
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确保在关闭已经开始时没有启动新的循环.我的理解是正确和完整的吗?
我知道当Windows关闭时,它会向每个应用程序发送WM_QUERYENDSESSION消息.这样可以轻松检测Windows何时关闭.但是,是否可以知道计算机是否要关闭电源,或者是否在Windows关闭后重新启动.
我并不是特别有希望,考虑到MSDN上的文档有这样的说法WM_QUERYENDSESSION:"......无法确定发生了哪个事件,"但stackoverflow的累积聪明从未让我感到惊讶.
我正在使用derby作为嵌入式数据库.此外,我正在使用它的内存数据库选项进行单元测试.
我无法弄清楚的是如何正确关闭(快速查看代码) Derby数据库.我相信我让它适用于标准数据库但我在内存数据库中尝试类似代码时会遇到不同的异常.
我将省略细节,如果需要其他感觉,我会添加它们.
基本上,我试图在这两种方式中关闭我的数据库,我的内存数据库一直被称为"呃":
DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");
Run Code Online (Sandbox Code Playgroud)
然后:
DriverManager.getConnection("jdbc:derby:eh;shutdown=true");
Run Code Online (Sandbox Code Playgroud)
前者导致异常但不是预期的异常.细节是:
java.sql.SQLNonTransientConnectionException:数据库'内存:呃'关闭.
后者导致
java.sql.SQLException:找不到数据库'呃'.
根据我能够弄清楚的,我们想要一个SQLException但不是我们收到的那个.另一方面,SQLNonTransientConnectionException错误似乎更合适,但不是正确的类型(虽然它是派生的SQLException),也没有正确的状态代码.州代码最终是:08006.
我的示例代码说明了SQLException一个SQL状态为"XJ015"的代码.
注意:我引用的示例是:WwdEmbedded Program(Java Code).
我通过docker文件中的ENTRYPOINT配置启动mongodb.它工作正常.但是,当我执行时:
docker stop <containerid>
Run Code Online (Sandbox Code Playgroud)
它似乎是在向流程发送SIGTERM.这意味着mongod.lock文件未被清除.如何正常关闭正在运行的docker容器,以便将正确的信号发送到docker中运行的进程?
我用Java启动子进程如下:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
Run Code Online (Sandbox Code Playgroud)
它现在在后台运行.一切都好又好.
如果我现在的程序崩溃(这是仍然在开发中:-))子进程似乎仍流连.如何在父Java进程终止时自动结束?
如果它有帮助,我使用的是Mac OS X 10.5
我已经有这个问题很长一段时间了.模拟器启动正常.但是,当您长按电源按钮(或F7键)并选择"关闭电源"时,它表示它正在关闭 - 但"关机"消息将永远保留在屏幕上.
虽然我可以直接关闭模拟器窗口,或者杀死它的进程,但我想知道关闭Android模拟器的正确方法是什么.
我有一个gRPC服务器,它承载两个异步服务("Master"和"Worker"),我想为服务器实现正常关闭.每项服务都有自己的grpc::CompletionQueue.
有似乎有两种Shutdown()方法,可能是相关的:grpc::CompletionQueue::Shutdown()和grpc::Server::Shutdown(),但它应该使用那些文件目前尚不清楚.
关闭异步服务有什么好的模式?
在spring bean的destroy方法中,我想执行一些查询来清理数据库中的一些东西.Spring似乎无法以任何方式找到它.
错误始终如下:
破坏方法的调用上的名字豆失败"someBean":org.springframework.beans.factory.BeanCreationNotAllowedException:错误创建名为"transactionManager的"豆:辛格尔顿bean创建时不允许使用这家工厂的单身人士都在破坏(不要求在destroy方法实现中来自BeanFactory的bean!)
以下将告诉spring在不再需要bean之后调用shutdownDestroy.但是,我在尝试使用事务时遇到上述错误.
<bean id="someId" name="someName" class="someClass"
destroy-method="shutdownDestroy"/>
Run Code Online (Sandbox Code Playgroud)
使用以下命令启用公共生命周期注释时也是如此:
<bean class="org.springframework. ... .CommonAnnotationBeanPostProcessor"/>
Run Code Online (Sandbox Code Playgroud)
然后用方法标记方法@PreDestroy.该方法也不能使用事务.
有没有办法做到这一点?
编辑:谢谢!我有bean实现SmartLifecycle并添加以下内容,它的工作非常好.
private boolean isRunning = false;
@Override
public boolean isAutoStartup() {return true;}
@Override
public boolean isRunning() {return isRunning;}
/** Run as early as possible so the shutdown method can still use transactions. */
@Override
public int getPhase() {return Integer.MIN_VALUE;}
@Override
public void start() {isRunning = true;}
@Override
public void stop(Runnable callback) {
shutdownDestroy();
isRunning = false;
callback.run();
}
@Override
public void …Run Code Online (Sandbox Code Playgroud)