singlehander 默认对ctrl+c 是直接 退出进程的,即jvm,不管内部线程运行到什么程度的。
如果我们想在收到ctrl+c信号后,让所有线程自然退出,特别是线程中的循环,让正在执行的这次循环完成了再退出,或者留下断点,以便下次重启能够从断点续发,就不能再用默认的singlehander了,应该是新写handler,用个volatile 变量来做标记,让所有线程自己处理退出。
下面的例子就是让线程自己退出。
public class TestSignal extends Thread implements SignalHandler {
private static volatile boolean tag=true;private SignalHandler oldHandler;
private void signalCallback(Signal sn) {
System.out.println(sn.getName() + "is recevied.");
}
// @Override
public void handle(Signal signalName) {
signalCallback(signalName);
tag=true;
}
public void run(){
for(int i = 1; i <= 100; i++){
if(tag){
return;
}
Thread.sleep(100);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println(i);
}
}
public static void main(String[] args) throws InterruptedException {
TestSignal testSignalHandler = new TestSignal();
(new TestSignal()).start();
// Runtime.getRuntime().addShutdownHook(new DameonThread());
// install signals
// Signal.handle(new Signal("TERM"), testSignalHandler);
SignalHandler t = Signal.handle(new Signal("INT"), testSignalHandler);
testSignalHandler.setOldHandler(t);
for (;;) {
Thread.sleep(3000);
System.out.println("running......");
}
}
}
本文介绍了一种方法,在接收到Ctrl+C信号后,让线程自行完成当前循环并优雅退出,避免直接终止JVM。通过使用volatile变量作为标记,实现了线程在接收到信号后能按需退出,支持后续重启时从断点继续执行。
2635

被折叠的 条评论
为什么被折叠?



