1. 线程中断
线程中断并不会使线程立即退出,而是给线程发送一个通知,提醒它退出。有三个方法与线程中断有关:
- 实例方法 interrupt () :它通知目标线程中断,也就是给目标线程设置中断标志位。
- 实例方法 isInterrupted () :它通过检查中断标志位来判断目标线程是否被中断。
- 静态方法 interrupted () :它和 isInterrupted 方法类似,也能判断目标线程是否中断,同时它还会清除中断标志位。
2. interrupted 和 isInterrupted的区别
public class s {
public static void main(String[] args) throws InterruptedException {
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
for (; ; ) {
}
}
});
threadOne.start();
threadOne.interrupt();
System.out.println(threadOne.isInterrupted());
System.out.println(threadOne.isInterrupted());
Thread.currentThread().interrupt();
System.out.println(Thread.interrupted()); //此时是中断状态,返回true。但会清除中断状态
System.out.println(Thread.interrupted()); //由于前面清除了中断状态,所以这里返回false
}
返回结果为:true,true;true,false
- interrupt() 方法发出的中断信号能被 wait()、 sleep()、 join() 捕捉到并产生中断。
- interrupted 作用于当前线程(main线程);isInterrupted 作用于调用该方法的线程对象所对应的线程(threadOne线程)。
- 返回结果true表示线程状态被置为中断状态,false表示未中断状态,线程中断仅仅是设置线程的中断状态位,不会停止线程。
- interrupted 是静态方法,isInterrupted 不是,它们最终都会调用同一个方法——isInterrupted,中断状态将会根据传入的 ClearInterrupted 参数值来确定是否重置中断状态,interrupted 对 ClearInterrupted 传入的参数是true,表示会清除中断状态,而 isInterrupted 传入的参数是false,表示不会清除中断状态。
- main 线程不能调用 isInterrupted 方法,因为 main 线程是静态的,isInterrupted 是非静态的。子线程都可以调用,但是若想知道子线程的状态,只能调用子线程.isInterrupted,因为子线程.interrupted 返回的不是子线程的状态,而是所在main线程的状态。