java 线程中断

线程中断

    本人理解为线程之间(也可以是线程自己跟自己)打招呼,让你停下来,但是具体的停不停自己说了算。线程可以有三个选择:一,让jvm把我停止吧(由jvm控制);二,做个收尾工作,之后return;三,我凭啥听你的,不停。

    第一种做法:java中调用一个线程的interrupt()方法。这个方法只是给线程的中断标志位设置为true,具体何时来实施中断的动作是由jvm来控制。对于这个中断标志,如果线程不清除这个中断标志,最后是被jvm来停止这个线程。

    下面看下第二种和第三种。

    那这里就会提出问题,我想执行了interrupt()方法后立即让程序停止如何做呢?往下看,我们接下来看两个方法

    boolean: interrupted()      类方法,作用:返回线程的中断标志位,返回中断标志位后直接将中断标志位reset(重新设置为false)。

    boolean: isInterrupted()   实例方法,作用:返回线程的中断标志位。

    立即停止线程的做法可以通过调用 interrupted()类方法(代码第二种),循环执行条件加入!interrupted()条件判断,并将标志位重置为false(不让jvm帮你中断),然后收尾,或者不停继续按我的条件运行(代码第三种)。

第二种
void run() {
    ....
    while (!interrupted()) {    // 执行这个方法中断标志就会被reset
        ....
    }
    return;
}
第三种
void run() {
    ....
    while (XXX) {
        if (interrupted()) {    // 执行这个方法中断标志就会被reset
            print("收到中断")
        }
        ....
    }
    return;
}

    上面都是线程正在运行的情况,那当线程阻塞(等待)的时候呢。当线程阻塞时(例如sleep,wait,join),线程收到中断请求后,将reset中断标志位(false)并被唤醒,抛出InterruptException。至于后续怎么做则交给线程自己来决定(如代码1)。

代码1
void run() {
    ....
    while (true) {    // 执行这个方法中断标志就会被reset
        try {
            sleep(1000000000);
        } catch (InterruptedException ex) {
            print("异常")
        }
        
    }
    ....
    return;
}

    当线程阻塞在 可被阻止的I/O操作 或者 Selector中,则线程立即返回,中断标志位被设置(jvm会把线程停止)。

完成,如果又不对的地方,大家随意拍砖,共同成长学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值