Java 线程中断
2017-08-26 13:08
246 查看
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果. 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了.
那么不能直接把一个线程搞挂掉, 但有时候又有必要让一个线程死掉, 或者让它结束某种等待的状态 该怎么办呢? 优雅的方法就是, 给那个线程一个中断信号, 让它自己决定该怎么办. 比如说, 在某个子线程中为了等待一些特定条件的到来, 你调用了Thread.sleep(10000), 预期线程睡10秒之后自己醒来, 但是如果这个特定条件提前到来的话, 你怎么通知一个在睡觉的线程呢? 又比如说,
主线程通过调用子线程的join方法阻塞自己以等待子线程结束, 但是子线程运行过程中发现自己没办法在短时间内结束, 于是它需要想办法告诉主线程别等我了. 这些情况下, 就需要中断.
中断是通过调用Thread.interrupt()方法来做的. 这个方法通过修改了被调用线程的中断状态来告知那个线程, 说它被中断了. 对于非阻塞中的线程, 只是改变了中断状态, 即Thread.isInterrupted()将返回true; 对于可取消的阻塞状态中的线程, 比如等待在这些函数上的线程, Thread.sleep(), Object.wait(), Thread.join(),
这个线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为false.
中断状态可以通过 Thread.isInterrupted()来读取,并且可以通过一个名为 Thread.interrupted()的静态方法读取和清除状态(即调用该方法结束之后, 中断状态会变成false)。
由于处于阻塞状态的线程 被中断后抛出exception并置回中断状态, 有时候是不利的, 因为这个中断状态可能会作为别的线程的判断条件, 所以稳妥的办法是在处理exception的地方把状态复位:
public class ThreadInterrupt extends Thread {
@Override
public synchronized void start() {
super.start();
System.out.println("ThreadInterrupt is start!");
}
public synchronized void kill() {
interrupt();
System.out.println("ThreadInterrupt is kill!");
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(1000); // 延迟50秒
System.out.println("ThreadInterrupt is runing!");
} catch (InterruptedException e) {
interrupt();
}
}
}
}
那么不能直接把一个线程搞挂掉, 但有时候又有必要让一个线程死掉, 或者让它结束某种等待的状态 该怎么办呢? 优雅的方法就是, 给那个线程一个中断信号, 让它自己决定该怎么办. 比如说, 在某个子线程中为了等待一些特定条件的到来, 你调用了Thread.sleep(10000), 预期线程睡10秒之后自己醒来, 但是如果这个特定条件提前到来的话, 你怎么通知一个在睡觉的线程呢? 又比如说,
主线程通过调用子线程的join方法阻塞自己以等待子线程结束, 但是子线程运行过程中发现自己没办法在短时间内结束, 于是它需要想办法告诉主线程别等我了. 这些情况下, 就需要中断.
中断是通过调用Thread.interrupt()方法来做的. 这个方法通过修改了被调用线程的中断状态来告知那个线程, 说它被中断了. 对于非阻塞中的线程, 只是改变了中断状态, 即Thread.isInterrupted()将返回true; 对于可取消的阻塞状态中的线程, 比如等待在这些函数上的线程, Thread.sleep(), Object.wait(), Thread.join(),
这个线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为false.
中断状态可以通过 Thread.isInterrupted()来读取,并且可以通过一个名为 Thread.interrupted()的静态方法读取和清除状态(即调用该方法结束之后, 中断状态会变成false)。
由于处于阻塞状态的线程 被中断后抛出exception并置回中断状态, 有时候是不利的, 因为这个中断状态可能会作为别的线程的判断条件, 所以稳妥的办法是在处理exception的地方把状态复位:
public class ThreadInterrupt extends Thread {
@Override
public synchronized void start() {
super.start();
System.out.println("ThreadInterrupt is start!");
}
public synchronized void kill() {
interrupt();
System.out.println("ThreadInterrupt is kill!");
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(1000); // 延迟50秒
System.out.println("ThreadInterrupt is runing!");
} catch (InterruptedException e) {
interrupt();
}
}
}
}
相关文章推荐
- [例程] 挑战:中断Java线程 (zt zdnet.com)
- Java怎样中断一个运行中的线程(2)
- Java并发学习之三——线程的中断
- Java线程(四)----线程中断、线程让步、线程睡眠、线程合并
- 【Java并发编程】之二:线程中断(含代码)(r)
- 如何中断JAVA线程
- Java并发(3)-中断线程
- [Java] 线程中断(一)
- 用interrupt()中断Java线程
- java 线程 被相互排斥堵塞、检查中断演示样例解说----thinking java4
- Java线程的中断
- Java Thread.interrupt 害人! 中断JAVA线程
- Java线程中断(四)
- Java线程(四):线程中断、线程让步、线程睡眠、线程合并
- 详细分析Java中断机制---线程
- Java Thread.interrupt 害人! 中断JAVA线程(zz)
- java线程之中断线程Interrupted用法
- Java线程中断的本质深入理解
- 【Java 基本功之中断线程的理解】
- 【Java并发编程】之二:线程中断(含代码)