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()方法的实际应用:
作者:hangwei
出处:http://www.cnblogs.com/hangwei/
关于作者:专注于开源平台,分布式系统的架构设计与开发、数据库性能调优等工作。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
如果您觉得文章对您有帮助,可以点击文章右下角“推荐”一下。您的鼓励是作者坚持原创和持续写作的最大动力!