代码改变世界

Java线程中断机制

2022-12-08 09:53  杭伟  阅读(42)  评论(0编辑  收藏  举报

在阅读AQS源码以及juc包很多基于AQS的应用源码过程中,会遇到很多interrupted相关的方法,这里复习一下java线程中断相关。

要点:使用interrupt()中断一个线程,该方法只是标记中断,并不会马上中断。马上中断使用stop(),该方法已过期,不建议使用(立刻中断容易造成生产数据一致性问题)。

 

interrupt()、interrupted()、isInterrupted()和stop()方法的使用和区别

demo代码:

 1 package org.example;
 2 
 3 public class Main {
 4     public static void main(String[] args) throws InterruptedException{
 5         //interrupt()、interrupted()、isInterrupted()和stop()方法的使用和区别
 6         Thread t = new Thread(new Runnable() {
 7             @Override
 8             public void run() {
 9                 int i=0;
10                 //for(;;) System.out.println(i++);//没有设置中断标记条件则永远不会中断
11 
12 /*                while (!Thread.currentThread().isInterrupted())//设置了中断标记,可以被中断
13                     System.out.println(i++);*/
14 
15                 while (!Thread.interrupted())//设置了中断标记,可以被中断,并在之后清除中断标记
16                     System.out.println(i++);
17 
18                 System.out.println(Thread.currentThread().isInterrupted());//上面调用isInterrupted()输出true,调用interrupted()输出false
19             }
20         });
21         t.start();
22         Thread.sleep(2000);
23         //t.stop();//立即停止线程(不管线程任务有没有执行完毕都马上退出并释放锁,不再建议使用,生产中可能会导致数据不一致。
24         t.interrupt();//不会停止线程,只是给线程设置中断标记。线程任务是否真的中断,取决于线程自己。程序会继续往下执行。
25 
26     }
27 }

 

同时从源码中可以看到:interrupted()方法和isInterrupted()方法调用相同,只是传参加了一个清除中断标记信息。

 

也注意到,

在ThreadPoolExecutor线程池中,有interrupted()、isInterrupted()、interrupt()方法的实际应用: