广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈Thread.sleep()为什么要抛出中断异常
  • 314
分享到

浅谈Thread.sleep()为什么要抛出中断异常

Thread.sleep()中断Thread.sleep()中断异常 2023-05-17 05:05:41 314人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

从场景说起 假设sleep()方法不抛出中断异常,也就是线程没有中断响应能力,会怎么样? 考虑如下场景: 线程A:sleep中 线程B:A别睡了,要关机啦(向A发送中断信号) 线程A

从场景说起

假设sleep()方法不抛出中断异常,也就是线程没有中断响应能力,会怎么样?

考虑如下场景:

线程A:sleep中

线程B:A别睡了,要关机啦(向A发送中断信号)

线程A:sleep中

这样好吗?这不好。因为线程A对外界情况没有感知能力。

中断就起到了这样的作用:让线程具有感知的能力。sleep(),wait()等方法都需要你去处理中断异常,也就是需要你的代码能够响应中断。

响应中断

什么叫能够响应中断呢?下面这段最常见的代码可以响应吗?

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    e.printStackTrace();
}

答案是可以响应,但还不够。为什么呢?

如下图,官方文档说了:抛异常的同时,该线程的中断状态会被清除。

那中断状态清除了,有什么影响吗?

当然有,我们一般代码都会这样写:(目的:休眠100毫秒后,判断线程是否被中断,如果未被中断则继续执行业务)

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    //中断标志已经被清除了
}
// Thread.currentThread().isInterrupted():是否被中断了(是否有中断标志)
if(!Thread.currentThread().isInterrupted()) {
    //如果没有被中断,则处理业务
    doSomething();
}

如果你运行起来会发现,即使线程在sleep期间被中断,我们下面的代码依然会执行。为什么呢?就是因为sleep是会擦除中断标志的。

那你可能会说:我为什么要写if(!Thread.currentThread().isInterrupted())呢?我平时都不判断的。

首先这是个demo,主要是展示效果。其次,我们任何代码都要有响应中断的能力,所以一般加个while(!Thread.currentThread().isInterrupted())。

回到上面的demo,如果要实现休眠100毫秒后,判断线程是否被中断,如果未被中断则继续执行业务该怎么办?

很简单,我们在本线程再中断一次即可。代码如下:

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    //中断标志已经被清除了
    // 手动中断本线程,将本线程打上中断信号。
    Thread.currentThread().interrupt();
}
// Thread.currentThread().isInterrupted():是否被中断了(是否有中断标志)
if(!Thread.currentThread().isInterrupted()) {
    //如果没有被中断,则处理业务
    doSomething();
}

如上述代码所示,我们手动调用interrupt()方法即可。这样业务代码就不会执行了。

关闭线程池

可能上述理论你还是有些懵。下面进入实战环节。

那么我们看看线程池如何关闭?

有两个api

void shutdown():等待队列和当前执行的任务会继续执行完。

List<Runnable> shutdownNow():对所有正在执行的任务线程发送中断信号。等待队列的任务会被返回。

这下你知道为什么我们代码需要有响应中断的能力了吗?我们先举一个无法停掉线程的例子:

ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.execute(()->{
    //任务一直跑
    while (true) {
        System.out.println("1");
    }
});
 
Thread.sleep(10);
executorService.shutdownNow();

你看,我们根本无法停掉任务,根本无法关闭线程池!

所以while(!Thread.currentThread().isInterrupted())才对嘛。

怎么关呢?代码我就不写了,关键点如下:

1.你的代码一定要有响应中断的能力。

2.sleep等方法就有这个能力。但是他会擦除中断标志位,记得调用Thread.currentThread().interrupt()恢复中断标志位哦。

到此这篇关于浅谈Thread.sleep()为什么要抛出中断异常的文章就介绍到这了,更多相关Thread.sleep()抛出中断异常内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈Thread.sleep()为什么要抛出中断异常

本文链接: https://www.lsjlt.com/news/210713.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈Thread.sleep()为什么要抛出中断异常
    从场景说起 假设sleep()方法不抛出中断异常,也就是线程没有中断响应能力,会怎么样? 考虑如下场景: 线程A:sleep中 线程B:A别睡了,要关机啦(向A发送中断信号) 线程A...
    99+
    2023-05-17
    Thread.sleep()中断 Thread.sleep()中断异常
  • 浅谈Map集合中get不存在的key值,会抛出异常吗
    在Java的Map集合中,如果使用get方法获取一个不存在的key值,不会抛出异常。相反,它会返回null值。Map集合是基于键值对...
    99+
    2023-08-17
    Map
  • java中的不抛出的异常是什么
    RuntimeException与其子类和错误(Error)不是必须要捕获或抛出。Java异常Throwable分为两类:Error和Exception,Error类是错误,程序本身不能处理的。Exception有分为两类:IOExcept...
    99+
    2014-12-27
    java入门 java 不抛出 异常
  • Java中抛出异常和捕获异常有什么区别
    这篇文章主要介绍Java中抛出异常和捕获异常有什么区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!抛出异常:创建异常对象,封装异常信息然后通过throw将异常对象传递给调用者。不对异常进行处理只对异常进行抛出是非常...
    99+
    2023-06-15
  • 浅谈pytorch中为什么要用 zero_grad() 将梯度清零
    pytorch中为什么要用 zero_grad() 将梯度清零 调用backward()函数之前都要将梯度清零,因为如果梯度不清零,pytorch中会将上次计算的梯度和本次计算的梯度...
    99+
    2022-11-12
  • 浅谈java中为什么重写equals后需要重写hashCode
    目录一、先看现象二、为什么要重写hashCode三、实现代码四、总结一、先看现象 public class TestDemo { public static void ...
    99+
    2022-11-12
  • Java中为什么需要慎用异常
    这篇文章给大家分享的是有关Java中为什么需要慎用异常的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。慎用异常在Java软件开发中,经常使用 try-catch 进行错误捕获,但是,try-catch 语句对系统性...
    99+
    2023-06-27
  • Java中为什么会出现Exception结构异常
    这期内容当中小编将会给大家带来有关Java中为什么会出现Exception结构异常,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. Java异常Exception的结构分析我们通常所说的Exceptio...
    99+
    2023-05-31
    java exception 中为
  • 计算机网络中为什么会出现网络连接异常
    这篇文章主要介绍计算机网络中为什么会出现网络连接异常,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!原因有:1、宽带本身的问题,直接联接宽带网线测试;2、路由器的问题,恢复出厂设置;3、网卡驱动没有或不合适引起的,网线...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作