总结了一下InterruptedException
异常相关的信息。java
中线程有一个终端状态,中断状态初始时为 false
;当另一个线程通过调用Thread.interrupt()
中断一个线程时,会出现以下两种情况之一。如果那个线程在执行一个低级可中断阻塞方法,(例如 Thread.sleep()
、 Thread.join()
或 Object.wait()
),那么它将取消阻塞并抛出InterruptedException
。否则,interrupt()
只是设置线程的中断状态。 在被中断线程中运行的代码以后可以轮询中断状态,看看它是否被请求停止正在做的事情。中断状态可以通过 Thread.isInterrupted()
来读取,并且可以通过一个名为 Thread.interrupted()
的操作读取和清除。
如何实现一个可被强制停止的线程
package interrupt;
/**
* 一个可停止的线程
* @author xuecm
*/
public class InterruptedThread extends Thread {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("working");
}
}
public static void main(String[] args) throws InterruptedException {
InterruptedThread t = new InterruptedThread();
t.start();
Thread.sleep(2000);
t.interrupt();
System.out.println("thread t is stopped");
}
}
输出结果
输出结果1.png但是我们一般不这么写线程,我们一般会让线程sleep一小段时间,所以进一步修改。
package interrupt;
/**
* 一个可停止的线程
* @author xuecm
*/
public class InterruptedThread extends Thread {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("working");
try {
sleep(500);
} catch (InterruptedException e) {
interrupt();//注意:因为在捕捉到InterruptedException异常的时候就会自动的中断标志置为了false,
}
}
}
public static void main(String[] args) throws InterruptedException {
InterruptedThread t = new InterruptedThread();
t.start();
Thread.sleep(2000);
t.interrupt();
System.out.println("thread t is stopped");
}
}
为什么不用stop()
因为这个方法以及被弃用,我本人并没有怎么使用过这个方法,也没有踩过他的坑,总之别用就对了。
具体请看Thread之九:stop。
其他参考文献:
https://www.cnblogs.com/canda/p/7835823.html
https://www.jianshu.com/p/a8abe097d4ed
https://www.ibm.com/developerworks/cn/java/j-jtp05236.html
网友评论