1.1.1 Thread.sleep抛异常

当某线程A处于Sleep状态时,另一个线程B调用了B.interrupt()方法,打断了A的Sleep过程,则A的Sleep会抛出异常。使用Catch后,线程不会等待Sleep时间,而是会立即执行。

下面的例子中,线程1的Sleep会被线程2打断,所以线程1的Sleep会抛异常。

public class SleepException {public static void main(String[] args) {      final Thread t1 = new Thread(){ public void run() {System.out.println("Thread1 start!");while (true){System.out.println("Thread1 sleep start!");try { Thread.sleep(10000); } catch (InterruptedException e) { System.out.println("Thread1 sleep exception e="+e.getMessage());e.printStackTrace(); }}} }; Thread t2 = new Thread() { public void run() {System.out.println("Thread2 start!");while (true){System.out.println("Thread2 sleep start!");try { Thread.sleep(2000); } catch (InterruptedException e) {System.out.println("Thread2 sleep exception e="+e);e.printStackTrace(); } t1.interrupt();}} }; t1.start(); t2.start(); }
}

1.1.2 Thread.interrupt的中断信号
Thread.interrupt()方法不会中断一个正在运行的线程。它的作用是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait,Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

interrupt方法并不是强制终止线程,它只能设置线程的interrupted状态,而在线程中一般使用一下方式:
while (!Thread.currentThread().isInterrupted() && more work to do)

{…}

  1. 调用A.interrupt时,会设置A的isInterrupted状态,通知A有重要的事情需要处理了。

  2. 具体A怎么处理,取决于A自己。也许是退出,也可以继续执行。

  3. 如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。以便及时对isInterrupted状态进行处理。

  4. Thread.interrupted()方法可以判断本线程是否收到了中断信号,并进行处理。此方法是读清的,下一次再判断就为false。直到收到新的中断信号。

  5. Thread.currentThread().isInterrupted()方法是非读清的。

  6. 中断方法interrupt是异步的,有一定延时的。A程序对B程序中断,A程序在走了几行后,B才能感知到中断。

例子:

public class SleepException {public static void main(String[] args) {final Thread t1 = new Thread() {public void run() {System.out.println("Thread1 start!");while (true) {if (Thread.currentThread().isInterrupted()){System.out.println("Thread1 isInterrupted 1");} else {// System.out.println("Thread1isInterrupted 1 false");}if (Thread.currentThread().isInterrupted()){System.out.println("Thread1 isInterrupted 2");}if (Thread.interrupted()) {System.out.println("Thread1 interrupted 3");}if (Thread.interrupted()) {System.out.println("Thread1 interrupted 4");}if (Thread.currentThread().isInterrupted()){System.out.println("Thread1 isInterrupted 5");}}}};Thread t2 = new Thread() {public void run() {System.out.println("Thread2 start!");while (true) {System.out.println("=================Thread2sleep start===============!");try {Thread.sleep(4000);} catch (InterruptedException e) {System.out.println("Thread2 sleep exception e=" + e);e.printStackTrace();}t1.interrupt();}}};t1.start();t2.start();}
}

Java Thread.sleep的InterruptedException 线程阻塞 线程中断相关推荐

  1. Python 多线程、守护进程、同时运行最大线程数、锁、线程阻塞(线程暂停和继续)

    python 多线程的使用笔记 1.多线程的基本用法 (1)简单任务多线程的开启方式 from threading import Thread import timedef target(name, ...

  2. java线程内存溢出_Java常见问题分析(内存溢出、内存泄露、线程阻塞等)

    Java垃圾回收机制(GC) 1.1 GC机制作用 1.2 堆内存3代分布(年轻代.老年代.持久代) 1.3 GC分类 1.4 GC过程 Java应用内存问题分析 2.1 Java内存划分 2.2 J ...

  3. Java并发编程(4):守护线程与线程阻塞的四种情况

    守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的运 ...

  4. 线程阻塞和挂起(网络收集)

    线程阻塞 线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行.或者是被其他的线程中断,该线程也会退出阻塞状态, ...

  5. 守护线程与线程阻塞的四种情况

    守护线程  Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的 ...

  6. 三个实例演示 Java Thread Dump 日志分析

    jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition ...

  7. java Thread Dump 日志分析

    jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition ...

  8. 线程队列 线程池 协程

    1 . 线程队列 from multiprocessing Queue , JoinableQueue  #进程IPC队列 from queue import Queue  #线程队列  先进先出 f ...

  9. java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别

    很多Java开发人员(包括我),尤其是刚进入软件行业的新手,认为Java设置线程中断就是表示线程停止了,不往前执行了, Thread.currentThread().interrupt() 其实不是这 ...

最新文章

  1. 捕捉mysql中不可忽视的知识点(二)
  2. python快速编程入门课后题答案-python语言程序设计基础(嵩天)第四章课后习题部分答案...
  3. 神经网络最优化方法比较(代码理解)
  4. 改工作空间_打拼六年换的新房,装修花了17万,飘窗改柜子很实用,谁见过?...
  5. 实录分享 | 计算未来轻沙龙:深度学习工具专场(PPT下载)
  6. 以下描述中不属于python语言控制结构的是_高中信息技术《Python语言》模块试卷...
  7. 怎么用vnc访问自己内网电脑,同时又是同一个会话?
  8. 数据库中间件漫谈——看看云时代,它会走向何方
  9. ASP动态网页开发中的WEB打印代码大全
  10. C++多线程Demo
  11. 【图像分割】基于matalb灰狼算法最小交叉熵多阈值图像分割【含Matlab源码 903期】
  12. 电子邮箱地址怎么弄?邮箱格式如何填写?
  13. 指针的指针(简单易懂)
  14. excel单元格内换行的方法
  15. CS模式,客户端页面加载
  16. 解决Vuser停在Gradual Exiting状态不动的问题
  17. 取消计算机系统密钥,BitLocker驱动器被加密怎么恢复密钥 忘了密码取消删除方法...
  18. 如何自己手动修改win10磁贴背景颜色?
  19. 上网行为管理_上网行为管理如何预防以及屏蔽勒索病毒攻击
  20. lambada 表达式

热门文章

  1. JAVA输入五中水果英文名称_用英语写所有水果的名称要附带汉语
  2. Vue学习--Vue项目根目录介绍(1)
  3. [高项]项目启动会VS开工会
  4. java8: sorted()之正序倒序
  5. 坦克世界服务器停机维护提前结束,《王者荣耀》4月7日体验服停机更新公告
  6. 作业1-游戏分类与热点探索
  7. 终于成功编译和运行了glc_player和glc_lib
  8. STM32CubeMX 软件包和扩展包下载教程
  9. Java反射机制--是什么,为什么,怎么用
  10. 遗传算法求取函数最值问题