Java线程中断机制

2023-06-10,,

在阅读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()方法的实际应用:

Java线程中断机制的相关教程结束。

《Java线程中断机制.doc》

下载本文的Word格式文档,以方便收藏与打印。