文章目录
- 介绍
- 中断方式一
- 中断方式二
- 中断方式三
- 源码解析
- 总结
介绍
三个方法:
1、public boolean isInterrupted()
判断线程是否被中断,如果此线程已被中断,则为true ;否则false 。
2、public void interrupt()
中断线程
3、public `static` boolean interrupted()
判断当前线程是否被中断
。通过该方法清除线程的中断状态。如果这个方法被连续调用两次,第二次调用将返回 false
(除非当前线程再次被中断,在第一次调用清除其中断状态之后,第二次调用检查它之前)。如果当前线程已被中断,则为true ;否则false 。
中断方式一
通过使用volatile
实现多线程中变量的共享,设置一个标志位
变量即可实现线程的中断。通过在另一个线程中修改变量标志位
,当前线程就会自己
实现中断。
中断方式二
通过一个原子类AtomicBoolean
设置标志位实现,思想和方式一大同小异。
中断方式三
源码解析
💡 1、interrupt()
public void interrupt() {if (this != Thread.currentThread())checkAccess();synchronized (blockerLock) {Interruptible b = blocker;if (b != null) {interrupt0(); // 只是为了设置中断标志b.interrupt(this);return;}}interrupt0();}
✏️中断简要流程图:
private native void interrupt0();
从上面可以看出interrupt0()
方法是一个本地方法,响应中断是由操作系统调度的。
💡 2、sleep()
public static native void sleep(long millis) throws InterruptedException;
该方法也是一个本地方法,用于在指定时间内,中断线程。如果任何线程中断了当前线程,那么就会抛出异常InterruptedException
时清除当前线程的中断状态。
💡3、isInterrupted()
如果此线程已被中断,则为true ;否则false 。
public boolean isInterrupted() {return isInterrupted(false);
}
下面本地方法
用于根据ClearInterrupted
传入的值判断是否重置中断状态
。
private native boolean isInterrupted(boolean ClearInterrupted);
💡4、Thread.interrupted()
判断当前线程是否被中断。通过该方法清除线程的中断状态。换句话说,如果这个方法被连续调用两次
,那么第二次
调用将返回 false
(除非当前线程再次被中断,在第一次调用清除其中断状态之后,第二次调用检查它之前)。如果当前线程已被中断,则为true ;否则false 。
public static boolean interrupted() {return currentThread().isInterrupted(true);}
✏️ 案例:
public class Zd4 {public static void main(String[] args) {System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());System.out.println("hello");Thread.currentThread().interrupt();System.out.println("world");System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());Thread.currentThread().interrupt();System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());}
}
🎨 运行结果:
main false
main false
hello
world
main true
main false //发现没有,第二次为false
main true
main false //也是false
⚠️ 注意点: 如果在上面while(true)里面使用sleep(long)
,由于抛出InterruptedException
异常,那么中断标志位就会被置为false
,导致程序一直不退出while(true)
循环。
总结
中断仅仅是修改状态标志位,不会将线程立即停止。