singlehandler 處理 ctr+c 信號。

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;

//        oldHandler.handle(signalName);
    }
    
    public void run(){    

        for(int i = 1; i <= 100; i++){   

            if(tag){

             return;

            }

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


   

發佈了27 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章