singlehandler 处理 ctr+c 信号。

本文介绍了一种方法,在接收到Ctrl+C信号后,让线程自行完成当前循环并优雅退出,避免直接终止JVM。通过使用volatile变量作为标记,实现了线程在接收到信号后能按需退出,支持后续重启时从断点继续执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值