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......");
}
}
}