首页IT科技java线程中断后不能继续执行(Java线程中断)

java线程中断后不能继续执行(Java线程中断)

时间2025-06-20 22:47:23分类IT科技浏览3977
导读:Java线程里:“中断”就是指“终止”,与操作系统里的"中断"、“异常”是完全不同的概念; 由于stop( 方法过于暴力,可能导致资源回收无法风险、开销过大等问题,此方法已过期,故Java中没有强制中断线程的手段;但可以调用interupt( 、interupted( 方法来向进程提出中断请求,待进程自行处理,这是...

Java线程里:“中断            ”就是指“终止                  ”            ,与操作系统里的"中断"            、“异常      ”是完全不同的概念;

由于stop()方法过于暴力                  ,可能导致资源回收无法风险                  、开销过大等问题      ,此方法已过期         ,故Java中没有强制中断线程的手段;但可以调用interupt()      、interupted()方法来向进程提出中断请求                  ,待进程自行处理         ,这是一种更优雅的中断方式            。

注意:当需要中断线程时      ,最佳实践就是利用线程的中断位                  ,而不是自定义中断状态            ,因为当线程被阻塞时   ,原生中断位仍然会被监听                  ,而自定义的则不能                  。

以下两类场景会应用到线程中断:

用来打断正在阻塞的线程:阻塞在sleep/wait/join等方法上         、 阻塞在io-channel读写操作上                  、阻塞在io-channel-selector上      。

打断正常执行的线程:需要在目标线程内部检测中断位               ,并由用户手动终止,来做出响应         。

interrupt()

实例方法               ,在线程内外都可发起调用;其作用是中断此线程(此线程不一定是当前线程                  ,而是指调用该方法的Thread实例所代表的线程)   ,但实际上只是给线程设置一个中断标志            ,线程仍会继续运行                  。)作用与正常线程会将中断标记设置为true,但是作用于阻塞线程会将中断标志刷新false(中断标记默认为false                  ,刷新就是重新刷会默认)         。

interrupted()

静态方法      ,只能在线程内部调用;作用是测试当前线程是否被中断(检查中断标志)         ,返回一个boolean并清除中断状态                  ,第二次再调用时中断状态已经被清除         ,将返回一个false      。

isInterrupted()

作用是只检测此线程是否被中断       ,不清除中断状态                  。 不在线程内部检测中断位并手动响应中断                  ,线程将无限执行下去: public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { while (true) { System.err.println("子线程"); } }); thread.start(); System.out.println("---" + thread.isInterrupted()); // ---false /** * 这主线程只是改变了子线程的中断位改为了true * 由于子线内部并没有就中断位进行检测和处理            ,故子线程并不会终止   ,会无限打印下去 */ thread.interrupt(); TimeUnit.SECONDS.sleep(1); System.err.println("===" + thread.isInterrupted()); // ===true } 在非阻塞线程内部手动响应中断: public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { System.out.println(Thread.currentThread().isInterrupted()); System.err.println("子线程"); } }); thread.start(); System.out.println("---" + thread.isInterrupted()); // ---false /** * 这主线程只是改变了子线程的中断位改为了true */ TimeUnit.SECONDS.sleep(3); thread.interrupt(); System.err.println("===" + thread.isInterrupted()); // ===true } 在非阻塞线程内部手动响应中断: /** * 当子线程需要响应主线程的中断请求                  ,而停止时            。可以通过在子线程中实时检测其自身的中断状态来达到停止的目的 * * @param args */ public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { // 实时检测自身中断状态 while (!Thread.currentThread().isInterrupted()) { System.err.println("子线程"); } }); thread.start(); TimeUnit.SECONDS.sleep(2); // 修改子线程的中断状态 thread.interrupt(); } 中断阻塞中的线程: public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { // 异常被捕获后               ,阻塞被打破         、中断位被设为false,所以异常中永远输出false System.out.println("2 ----" + Thread.currentThread().isInterrupted()); // 2 ----false System.err.println("回收资源"); e.printStackTrace(); } System.err.println("子线程逻辑"); } }); thread.start(); TimeUnit.SECONDS.sleep(1); thread.interrupt(); System.out.println(thread.isInterrupted()); // true TimeUnit.SECONDS.sleep(5); } 优雅中断非阻塞线程: public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { while (true) { if (Thread.interrupted()) { System.out.println("清理资源"); break; } System.err.println("子线程逻辑"); } }); thread.start(); TimeUnit.SECONDS.sleep(1); thread.interrupt(); }

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
国产爆款轿跑官宣(国产paozhu c++ web framework 正式版发布)