Java Thread.sleep的InterruptedException 线程阻塞 线程中断
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)
{…}
调用A.interrupt时,会设置A的isInterrupted状态,通知A有重要的事情需要处理了。
具体A怎么处理,取决于A自己。也许是退出,也可以继续执行。
如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。以便及时对isInterrupted状态进行处理。
Thread.interrupted()方法可以判断本线程是否收到了中断信号,并进行处理。此方法是读清的,下一次再判断就为false。直到收到新的中断信号。
Thread.currentThread().isInterrupted()方法是非读清的。
中断方法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 线程阻塞 线程中断相关推荐
- Python 多线程、守护进程、同时运行最大线程数、锁、线程阻塞(线程暂停和继续)
python 多线程的使用笔记 1.多线程的基本用法 (1)简单任务多线程的开启方式 from threading import Thread import timedef target(name, ...
- java线程内存溢出_Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
Java垃圾回收机制(GC) 1.1 GC机制作用 1.2 堆内存3代分布(年轻代.老年代.持久代) 1.3 GC分类 1.4 GC过程 Java应用内存问题分析 2.1 Java内存划分 2.2 J ...
- Java并发编程(4):守护线程与线程阻塞的四种情况
守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的运 ...
- 线程阻塞和挂起(网络收集)
线程阻塞 线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行.或者是被其他的线程中断,该线程也会退出阻塞状态, ...
- 守护线程与线程阻塞的四种情况
守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的 ...
- 三个实例演示 Java Thread Dump 日志分析
jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition ...
- java Thread Dump 日志分析
jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition ...
- 线程队列 线程池 协程
1 . 线程队列 from multiprocessing Queue , JoinableQueue #进程IPC队列 from queue import Queue #线程队列 先进先出 f ...
- java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别
很多Java开发人员(包括我),尤其是刚进入软件行业的新手,认为Java设置线程中断就是表示线程停止了,不往前执行了, Thread.currentThread().interrupt() 其实不是这 ...
最新文章
- 捕捉mysql中不可忽视的知识点(二)
- python快速编程入门课后题答案-python语言程序设计基础(嵩天)第四章课后习题部分答案...
- 神经网络最优化方法比较(代码理解)
- 改工作空间_打拼六年换的新房,装修花了17万,飘窗改柜子很实用,谁见过?...
- 实录分享 | 计算未来轻沙龙:深度学习工具专场(PPT下载)
- 以下描述中不属于python语言控制结构的是_高中信息技术《Python语言》模块试卷...
- 怎么用vnc访问自己内网电脑,同时又是同一个会话?
- 数据库中间件漫谈——看看云时代,它会走向何方
- ASP动态网页开发中的WEB打印代码大全
- C++多线程Demo
- 【图像分割】基于matalb灰狼算法最小交叉熵多阈值图像分割【含Matlab源码 903期】
- 电子邮箱地址怎么弄?邮箱格式如何填写?
- 指针的指针(简单易懂)
- excel单元格内换行的方法
- CS模式,客户端页面加载
- 解决Vuser停在Gradual Exiting状态不动的问题
- 取消计算机系统密钥,BitLocker驱动器被加密怎么恢复密钥 忘了密码取消删除方法...
- 如何自己手动修改win10磁贴背景颜色?
- 上网行为管理_上网行为管理如何预防以及屏蔽勒索病毒攻击
- lambada 表达式