在阅读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,Thread,中断,interrupted,isInterrupted,线程,interrupt From: https://www.cnblogs.com/hangwei/p/16960547.html