前言:
三个方法,都是Thread中定义的方法,其中interrupted()是Thread中的静态方法:
interrupt() : 给调用线程加入一个中断点,但是不会结束此线程。
isInterrupted():返回此线程的中断状态,但是不会移除此线程中断状态。
interrupted():返回的是当前线程的中断状态,会移除当前线程的中断状态
isInterrupted()、interrupted()区别
方法名 | 返回线程中断状态 | 是否会移除线程的中断状态 | 作用范围【重点】 |
---|---|---|---|
isInterrupted() | 是 | 否 | 调用者线程 |
interrupted() | 是 | 是 | 当前线程 |
代码示例
- isInterrupted():
public class ThreadTest extends Thread{
public static void main(String[] args) throws InterruptedException {
ThreadTest threadTest = new ThreadTest();
threadTest.start();
// 1.给threadMethod 线程加入中断点
threadTest.interrupt();
// 2. threadTest 线程中断状态
System.out.println("第一次获取threadTest的线程中断状态:" + threadTest.isInterrupted());
System.out.println("第二次获取threadTest的线程中断状态:" + threadTest.isInterrupted());
}
@Override
public void run() {
for (int i =0 ; i<10; i++){
if(i == 5){
// 3. 获取到当前对象的线程中断状态
System.out.println("第一次当前线程中断状态:" + Thread.currentThread().isInterrupted());
System.out.println("第二次当前线程中断状态:" + Thread.currentThread().isInterrupted());
// 5.根据中断状态 结束线程
if (Thread.interrupted()){
return;
}
}
System.out.println("i == " + i);
}
}
}
打印结果-执行顺序可能不同:
第一次获取threadTest的线程中断状态:true
第二次获取threadTest的线程中断状态:true
i == 0
i == 1
i == 2
i == 3
i == 4
第一次当前线程中断状态:true
第二次当前线程中断状态:true
解析:
代码 1 给 threadTest 加入线程中断状态, 通过被中断的线程对象调用 isInterrupted() 获取到线程的中断状态,代码 2 3 多次获取结果均为 True, 最后通过代码 5 结束正在运行的线程,实现主线程对其他线程的控制。
- interrupted() 是 Thread 内置静态方法,调用 Thread.interrupted() :
public class ThreadTest extends Thread{
public static void main(String[] args) throws InterruptedException {
ThreadTest threadTest = new ThreadTest();
threadTest.start();
// 1.给threadMethod 线程加入中断点
threadTest.interrupt();
// 2. threadTest 线程中断状态
System.out.println("第一次获取main的线程中断状态:" + Thread.interrupted());
System.out.println("第二次获取main的线程中断状态:" + Thread.interrupted());
}
@Override
public void run() {
for (int i =0 ; i<10; i++){
if(i == 5){
// 3. 获取到当前对象的线程中断状态
System.out.println("第一次当前线程中断状态:" + Thread.interrupted());
System.out.println("第二次当前线程中断状态:" + Thread.interrupted());
// 4.根据中断状态 结束线程
if (Thread.interrupted()){
return;
}
}
System.out.println("i == " + i);
}
}
}
打印结果:
第一次获取main的线程中断状态:false
第二次获取main的线程中断状态:false
i == 0
i == 1
i == 2
i == 3
i == 4
第一次当前线程中断状态:true
第二次当前线程中断状态:false
i == 5
i == 6
i == 7
i == 8
i == 9
解析:
代码 1 是给 threadTest 线程加入线程中断状态,代码 2 获得的是当前线程 【main】的中断状态,因此为 false
代码 3 因为 interrupted 会移除线程中断状态,所以第一次返回True 第二次返回 False。
代码 5 interrupted 移除了线程中断状态,因此无法Ruturn
源码:
为什么 两者 之间会有区别那,看看源码变知晓,不过多解释:
// isInterrupted() 返回当前线程中断状态
public boolean isInterrupted() {
return isInterrupted(false);
}
// interrupted 获取线程中断状态,并清除
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
// 获取当前线程。
public static native Thread currentThread();
/**
* 原生方法 获取线程中断状态
* ClearInterrupted 是否清除中断状态
*/
private native boolean isInterrupted(boolean ClearInterrupted);