JAVA线程对象2.3:interrupt方法(参考官方)

线程中断

interrupt方法作用是告知线程停止手头的工作转而去做别的事。通过interrupt终止线程是很常见的,不过你完全可以设定线程如何响应中断。这也是本节的重点。

 

调用某一线程的interrupt方法可以中断该线程。但想要中断机制正常工作,首先要得到线程支持。

支持中断

线程如何支持中断?这取决于线程当前在执行的内容。如果线程频繁调用抛出中断异常(InterruptedException)的方法,它就会在捕获异常后从run方法返回。例如,假设一个线程run方法中有一个循环,想要支持中断机制,它可以这样改:

for (int i = 0; i < importantInfo.length; i++) {
    // 休眠4秒
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        // 线程被中断
        return;
    }
    // 打印语句
    System.out.println(importantInfo[i]);
}

 

 很多方法都会抛出中断异常(InterruptedException),比如sleep方法,如果收到中断信息,就会马上中断当前操作并返回。

如果线程运行了很长时间,而且没有调用任何抛出中断异常的方法,这时候又该怎样呢?那它必须定期调用Thread.interrupted方法来判断线程是否已被中断,如果是则返回true 。例如:

for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
    if (Thread.interrupted()) {
        // 线程被已被终止
        return;
    }
}

 

 在这个简单的例子中,代码只是单纯地测试是否被中断,如果是,就退出。在复杂的应用程序中,最好还是抛出一个InterruptedException :

if (Thread.interrupted()) {
    throw new InterruptedException();
}

 

 这样写,就把处理线程中断的代码都集中在catch语句里头了。

 

线程中断状态标识

线程中断机制是靠一个叫中断状态(interrupt status)的内部标识来实现的。调用了Thread.interrupt来设置该标志。如果线程调用静态方法Thread.interrupted 检查中断,中断状态(interrupt status)便被清除。但使用其他线程的非静态isInterrupted方法来查询某线程的中断状态,是不会改变该线程的中断状态标识的(interrupt status flag)。

 

 

原文:

http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
 

 

猜你喜欢

转载自myalicedream.iteye.com/blog/2205885