Java终止子线程

Java终止子线程

使用 interrupt() 设置线程为中断状态,以此通知线程,作为一个结束的信号。

使用 isInterrupt() 检查线程的状态是否为中断状态以此作为结束的标志。

当被设置 interrupt()的线程处在等待状态中,如sleep之中,就会出现 InterruptedException 异常。可以在catch捕获并且退出。

public class Test {
    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    while (true) {
                        sleep(1000);
                        System.out.println("run!!!");
                        if (Thread.currentThread().isInterrupted()) {
                            System.out.println("end sub thread by interrupt");
                            break;
                        }
                    }
                } catch (InterruptedException e) {
//                    e.printStackTrace();
                    System.out.println("end sub thread by interrupt exception");
                }
            }
        });
        t1.start();
        try {
            sleep(4000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        t1.interrupt();
        sleep(1000);
        System.out.println("end main");

    }
}

最开始遇见这个问题的时候是在Android 服务里面的,Android Service 是默认运行在主线程的,服务操作一般又比较耗时,需要手动的开启一个子线程运行业务代码。当时写了一个小demo,大致意思是,在服务类的子线程执行一个死循环,作为测试服务组件的特性的。问题出现了 开启服务,子线程正常运行,销毁服务后,子线程却不会随着活动的销毁而销毁。

于是想到了当销毁服务的时候,直接干掉子线程,于是找打了这种方法,千万要注意的是需要去捕获 InterruptedException 这个异常。否则非常课能出错(sleep等情况下)。

现在想来当时的情况为什么不直接设置一变量,在while的时候检查一下,然后直接退出算了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值