【Java并发编程】interrupt

interrup是用来告诉线程应该停下来,去做些其他别的事情。但是这取决于编程人员的态度,他可以决定一个线程应该怎样对到来的interrupt做出反应。我们通过调用某个Thread对象的interrupt方法,来告诉那个线程我希望你能中断下来,但是,这只是一厢情愿,具体收到请求的Thread线程怎样处理接下来的事情完全取决于它自己。但是,通常来讲,它应该将自己设计成可以响应这种中断请求的。

这里不得不提到一个Exception,InterruptedException,顾名思义,该异常是要处理中断异常的,在上一节的内容中,Thread.sleep方法就会抛出该异常,该异常是需要通过try-catch处理的(也叫CheckedException,与之相对的是RuntimeException),后面要说到的Thread.wait方法等都是会抛出该异常的。该异常的设计初衷就是这样一种机制,当一个任务要执行或者可能执行很长时间的时候,我们将该方法设计成抛出该异常。意味着设计方法的人很明确的说明了,我这个方法设计成了可以响应中断的。比如:

for (int i = 0; i < importantInfo.length; i++) {
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        // 如果该线程正在sleep中,
        // 调用了该线程实例的interrupt方法后,代码会走到这里
        // 这里我们暂时什么也不做。
        return;
    }
    // Print a message
    System.out.println(importantInfo[i]);
}   

既然系统的方法可以设计成支持中断机制的,那么我们自己的方法如何设计成支持中断方法呢?

interrupt方法中做了一个重要的事情,就是将代表着中断的flag设置为true。isInterrupted方法用来检验该标志位,interrupted方法(注意区别-ed)用来检验该标志位的同时,清除该标志位,也就是将其设置为false。

前面说过中断机制本身是一种请求其中断的机制,不是强制其马上停止手上事情的机制。该请求的含义就蕴藏在这个标志位上。

于是我们可以设计自己的可中断的方法。

public void heavyWorkMethod() {
    for (int i = 0; i < bigNum; i++) {
        //每一个循环开始的时候,判断是否被中断
        if (Thread.isInterrupted()) {
            //什么都不做,直接返回
            return;
        }

        // heavy work here
        heavyWork();
    }

}

当然,我们也可以将方法设计成抛出InterruptException,这样我们可以统一在catch中处理该中断请求。

public void heavyWorkMethod() throws InterruptException {
    for (int i = 0; i < bigNum; i++) {
        //每一个循环开始的时候,判断是否被中断
        if (Thread.isInterrupted()) {
            //这里有一个惯例,也就是一个很弱的约定
            //当一个线程抛出了InterruptException的时候
            //它的flag标志位是应该清除的。
            Thread.interrupted();
            //我们抛出异常, 要求调用该方法的时处理该异常
            throw new InterruptException();
        }

        // heavy work here
        heavyWork();
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值