①. 什么是中断
①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已经被废弃了
②. 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制 — 中断
③. 中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现
④. 若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设为true
⑤. 每个线程对象中都有一个标识,用于标识线程是否被中断;该标识位为true表示中断,为false表示未中断;通过调用线程对象的interru pt方法将线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用
②. 源码解读(中断的相关API)
- ①. void interrupt( )实例方法
- interrupt( )仅仅是设置线程的中断状态未true,不会停止线程
- 源码解读
(如果这个线程因为wait()、join()、sleep()方法在用的过程中被打断(interupt),会抛出Interrupte dException)
②. boolean isInterrupted( )实例方法
判断当前线程是否被中断(通过检查中断标识位) 实例方法
③. static boolean interrupted( )静态方法
判断线程是否被中断,并清楚当前中断状态,这个方法做了两件事
(返回当前线程的中断状态 | 将当前线程的中断状态设为false)
原理:假设有两个线程A、B,线程B调用了interrupt方法,这个时候我们连接调用两次
isInterrupted方法,第一次会返回true,然后这个方法会将中断标识位设置位false,所以第二次调用将返回false
System.out.println(Thread.currentThread().getName()+"---"+Thread.interrupted()); System.out.println(Thread.currentThread().getName()+"---"+Thread.interrupted()); System.out.println("111111"); Thread.currentThread().interrupt();///----false---> true System.out.println("222222"); System.out.println(Thread.currentThread().getName()+"---"+Thread.interrupted()); System.out.println(Thread.currentThread().getName()+"---"+Thread.interrupted()); /** main---false main---false 111111 222222 main---true main---false * */
- ④. 比较静态方法interrupted和实例方法isInterrupted
- 静态方法interrupted将会清除中断状态(传入的参数ClearInterrupted位true)
- 实例方法isInterrupted则不会(传入的参数ClearInterrupted为false)