【Java并发编程】interrupt

来源:互联网 发布:北大青鸟网络授课 编辑:程序博客网 时间:2024/06/07 01:35

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();    }}