我搜索了网络,但未能找到结果。我正在寻找一个倾听者,当一个罐子崩溃/停止时,它会被召唤。我知道他们对于JFrame是这样的,但我没有使用Frame。 谢谢,艾弗里。
答案 0 :(得分:4)
查看java.lang.Runtime,方法
void addShutdownHook(Thread hook)
只有一个句子来自它的javadoc(但请务必阅读那里的所有小字体):当虚拟机开始其关闭序列时,它将以某些未指定的顺序启动所有已注册的关闭挂钩并让它们同时运行。
这是由堆栈溢出引起的“崩溃”:
static void rec(){ rec(); }
public static void main( String[] args ){
Thread thread = new Thread(){
public void run(){
System.out.println( "SHUTDOWN" );
}
};
Runtime.getRuntime().addShutdownHook( thread );
rec();
}
并打印SHUTDOWN。
这是一个应用程序与之前一样的关闭钩子,可以使用Ctrl-C或Linux样式kill %1
来杀死BG作业:
Runtime.getRuntime().addShutdownHook( thread );
try {
System.out.println( "Sleeping" );
Thread.sleep( 5000);
System.out.println( "Waking" );
} catch( Exception e ){
}
并打印SHUTDOWN。
最后,这里引发了java.lang.OutOfMemoryError: Java heap space
List<Object> objs = new ArrayList<>();
while( true ){
objs.add( new byte[0x10000000] );
}
并打印SHUTDOWN。 (对于堆空间的大量抓取,关闭钩子甚至可以创建一些新对象。但是应该编写它以便线程已经在其腹部具有所有必需的对象,具有预分配的内存。)