摘要:判断目标线程是否被中断,会清除中断标记。技术栈线程休眠被中断,程序退出。示例全部信息输出并正常退出,只是在方法被中断并清除标记后手动重新中断当前线程,然后程序接收中断信号返回退出。通过以上个中断示例,相信对线程中断的概念有了全面的了解。
在之前的一文《如何"优雅"地终止一个线程》中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分享的——线程中断。
下面的这断代码大家应该再熟悉不过了,线程休眠需要捕获或者抛出线程中断异常,也就是你在睡觉的时候突然有个人冲进来把你吵醒了。
try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }
此时线程被打断后,代码会继续运行或者抛出异常结束运行,这并不是我们需要的中断线程的作用。
到底是什么是线程中断?线程中断即线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系统强制终止线程,而线程中断则是给目标线程发送一个中断信号,如果目标线程没有接收线程中断的信号并结束线程,线程则不会终止,具体是否退出或者执行其他逻辑由目标线程决定。
我们来看下线程中断最重要的 3 个方法,它们都是来自 Thread 类!
1、java.lang.Thread#interrupt
中断目标线程,给目标线程发一个中断信号,线程被打上中断标记。
2、java.lang.Thread#isInterrupted()
判断目标线程是否被中断,不会清除中断标记。
3、java.lang.Thread#interrupted
判断目标线程是否被中断,会清除中断标记。
线程中断实战我们来实例演示下线程中断如何用!
示例1(中断失败)
/** * 微信公众号:Java技术栈 */ private static void test1() { Thread thread = new Thread(() -> { while (true) { Thread.yield(); } }); thread.start(); thread.interrupt(); }
请问示例1中的线程会被中断吗?答案:不会,因为虽然给线程发出了中断信号,但程序中并没有响应中断信号的逻辑,所以程序不会有任何反应。
示例2:(中断成功)
/** * 微信公众号:Java技术栈 */ private static void test2() { Thread thread = new Thread(() -> { while (true) { Thread.yield(); // 响应中断 if (Thread.currentThread().isInterrupted()) { System.out.println("Java技术栈线程被中断,程序退出。"); return; } } }); thread.start(); thread.interrupt(); }
我们给示例2加上了响应中断的逻辑,程序接收到中断信号打印出信息后返回退出。
示例3(中断失败)
/** * 微信公众号:Java技术栈 */ private static void test3() throws InterruptedException { Thread thread = new Thread(() -> { while (true) { // 响应中断 if (Thread.currentThread().isInterrupted()) { System.out.println("Java技术栈线程被中断,程序退出。"); return; } try { Thread.sleep(3000); } catch (InterruptedException e) { System.out.println("Java技术栈线程休眠被中断,程序退出。"); } } }); thread.start(); Thread.sleep(2000); thread.interrupt(); }
示例3 sleep() 方法被中断,并输出了 Java技术栈线程休眠被中断,程序退出。 程序继续运行……为什么呢?
来看 sleep 的源码:
可以看出 sleep() 方法被中断后会清除中断标记,所以循环会继续运行。。
示例4(中断成功)
/** * 微信公众号:Java技术栈 */ private static void test4() throws InterruptedException { Thread thread = new Thread(() -> { while (true) { // 响应中断 if (Thread.currentThread().isInterrupted()) { System.out.println("Java技术栈线程被中断,程序退出。"); return; } try { Thread.sleep(3000); } catch (InterruptedException e) { System.out.println("Java技术栈线程休眠被中断,程序退出。"); Thread.currentThread().interrupt(); } } }); thread.start(); Thread.sleep(2000); thread.interrupt(); }
示例4全部信息输出并正常退出,只是在 sleep() 方法被中断并清除标记后手动重新中断当前线程,然后程序接收中断信号返回退出。
通过以上 4 个中断示例,相信对 Java 线程中断的概念有了全面的了解。更多 Java 多线程技术文章请在后台回复关键字:多线程。
更多干货推荐
1.史上最强 Java 中高级面试题整理
2.史上最强 Spring Boot & Cloud 教程整理
3.史上最强架构设计分布式技术干货整理
更多请扫描下方的二维码关注我们的微信公众号,干货每日推送!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77306.html
摘要:接着线程过来通过方式获取锁,获取锁的过程就是通过操作变量将其值从变为。线程加锁成功后还有一步重要的操作,就是将设置成为自己。线程屁颠屁颠的就去等待区小憩一会去了。 一、写在前面 这篇文章,我们聊一聊Java并发中的核武器, AQS底层实现。 不管是工作三四年、还是五六年的在工作或者面试中涉及到并发的是时候总是绕不过AQS这个词。 首先,确实还有很多人连AQS是什么都不知道,甚至有的竟...
摘要:阻塞当进行读写时,线程是阻塞的状态。当任何一个收到数据后,中断程序将唤起进程。接收数据当收到数据后,中断程序会给的就绪列表添加引用。当接收到数据,中断程序一方面修改,另一方面唤醒等待队列中的进程,进程再次进入运行状态如下图。 本篇文章目的在于基本概念和原理的解释,不会贴过多的使用代码。 什么是NIO Java NIO (New IO)是 Java 的另一个 IO API (来自 jav...
摘要:撤销锁偏向锁使用了一种等到竞争出现才释放锁的机制,所以当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁。轻量级锁线程在执行同步代码块之前,会先在当前线程的栈桢中创建用于存储锁记录的空间,并将对象头中的复制到锁记录中,官方称为。 前言 作者前面也写了几篇关于Java并发编程,以及线程和volatil的基础知识,有兴趣可以阅读作者的原文博客,今天关于Java中的两种锁进行详解,希望对...
阅读 1356·2021-11-24 09:39
阅读 1345·2021-11-04 16:12
阅读 2682·2021-09-24 09:47
阅读 3336·2021-09-01 10:50
阅读 1476·2019-08-30 15:55
阅读 1423·2019-08-30 15:43
阅读 641·2019-08-30 11:08
阅读 3577·2019-08-23 18:33