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