一个运行中的线程不应该由其他线程强制中断或者停止,而应该由自己决定要不要停止。java提供了一种用于停止线程的协商机制--中断,也叫中断线程协商机制。

每一个线程都有一个中断标识位,用于表示该线程是否需要被中断,true表示需要被中断,false表示不需要被中断。中断只是一种协商机制 java没有给中断增加任何语法,中断过程完全需要程序自己实现。

在java中如何中断或者停止一个正在运行的线程?

第一种方法 用volalitle 关键字模拟中断标识位,通过修改模拟的中断标识位来让线程自己去处理中断或者停止,

 1 public class InterruptedDemo {
 2 
 3     private static volatile boolean INTERRUPT_STATUS = false ;
 4 
 5     public static void main(String[] args) {
 6 
 7         new Thread(() ->{
 8             while(true){
 9                 if(INTERRUPT_STATUS){
10                     System.out.println("线程中断标识被修改,要求线程进行中断");
11                     break;
12                 }
13                 System.out.println("hello interrupt...");
14             }
15         },"t1").start();
16 
17         try {
18             TimeUnit.MILLISECONDS.sleep(1);
19         } catch (InterruptedException e) {
20             e.printStackTrace();
21         }
22 
23         new Thread(() ->{
24             INTERRUPT_STATUS = true ;
25         },"t2").start();
26     }
27 }
View Code

 第二种方法 用 AtomicBoolean原子类去实现,原理和第一种方法一样,

 1 public class InterruptedDemo2 {
 2 
 3     private static AtomicBoolean INTERRUPT_STATUS = new AtomicBoolean(false) ;
 4 
 5     public static void main(String[] args) {
 6 
 7         new Thread(() ->{
 8             while(true){
 9                 if(INTERRUPT_STATUS.get()){
10                     System.out.println("线程中断标识被修改,要求线程进行中断");
11                     break;
12                 }
13                 System.out.println("hello interrupt...");
14             }
15         },"t1").start();
16 
17         try {
18             TimeUnit.MILLISECONDS.sleep(5);
19         } catch (InterruptedException e) {
20             e.printStackTrace();
21         }
22 
23         new Thread(() ->{
24             INTERRUPT_STATUS.set(true);
25         },"t2").start();
26     }
27 }
View Code

第三种方法 用Thread提供的interrupt()方法和 isInterrupted()方法来实现,

public class InterruptedDemo3 {

    public static void main(String[] args) {

        Thread t1 = new Thread(() -> {
            while (true) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("线程中断标识被修改,要求线程进行中断");
                    break;
                }
                System.out.println("hello interrupt...");
            }
        }, "t1");
        t1.start();

        try {
            TimeUnit.MILLISECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() ->{
            t1.interrupt();
        },"t2").start();
    }
}
View Code

其中线程中断机制 Thread提供了三个方法 interrupt(), interrupted() 和isInterrupted()

interrupt(), 仅仅设置线程的中断标识位为true,并不会立刻停止线程,程序执行过程中有两种情况 当正常运行的线程的interrupt()方法被调用时,仅仅将该线程的中断标识位的值设置位true,

如果线程处于阻塞状态(调用 wait,join,sleep方法)时,线程立即退出被阻塞的状态,并且抛出InterruptedException异常。

interrupted()是一个被 static修饰的方法 返回当前线程中断标识的值并且将当前线程中断标识的值设置位false。

isInterrupted() 判断当前线程是否被中断。