JDK源码剖析- Java并发实现原理学习 (二) InterruptedException与Interrupt函数

一、什么情况下会抛出Interrupted异常

Interrupt这个词很容易让人产生误解。从字面意思来看,好像是说一个线程运行到一半,把它中断了,然后抛出了InterruptedExcept ion异常,其实并不是。

 这个时候,在主线程中调用一句t.interrupt()请问该线程是否会抛出异常? 答案是不会

假设这个线程阻塞在一个 synchronized 关键字 的地方,正准备拿锁,如下代码所示。

在主线程中调用一句t.interrupt(),请问该线程是否会抛出异常? 答案是不会。 

 实际上,只有那些声明了会抛出 InterruptedException 的函数才会抛出异常,也就是下面这些常用的函数:

 

 二、轻量级阻塞与重量级阻塞

 轻量级阻塞 能够被中断的阻塞称为轻量级阻塞,对应的线程状态是WAITING或 者TIMED_WAITING

重量级阻塞 像 synchronized 这种不能被中断的阻塞称为重量级阻塞,对应的状态是 BLOCKED

初始线程处于NEW状态,调用start()之后开始执行,进入RUNNING或者READY状态。如果没有调用任何的阻塞函数,线程只会在RUNNING和READY之间切换,也就是系统的时间片调度。这两种状态的切换是操作系统完成的,开发者基本没有机会介入,除了可以调用yield() 函数,放弃对CPU的占用。

 一旦调用了图中的任何阻塞函数,线程就会进入WAITING或者TIMED_WAITING状态,两者的区别只是前者为无限期阻塞后者则传入了一 个时间参数,阻塞一个有限的时间

除了常用的阻塞/唤醒函数,还有一对不太常见的阻塞/唤醒函数,LockSupport.park()/unpark()。这对函数非常关键,Concurrent包中Lock的实现即依赖这一对操作原语。 

 三、Thread.isInterrupted()与Thread.interrupted()的区别

t.interrupted()相当于给线程发送了一个唤醒的信号, 所以如果线程此时恰好处于WAITING或者TIMED_WAITING状态,就会抛出一个InterruptedException,并且线程被唤醒. 而如果线程此时并没有被阻塞,则线程什么都不会做。

这两个函数都是线程用来判断自己是否收到过中断信号的,前者是非静态函数,后者是静态函数。二者的区别在于,前者只是读取中断状态,不修改状态; 后者不仅读取中断状态,还会重置中断标志位。 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
出现"/usr/local/jdk/jdk-17.0.1/bin/java: 无法执行进制文件"的错误通常是由于使用不兼容的架构或损坏的进制文件引起的。此错误可能是由于在安装过程中选择了错误的JDK版本或者下载的JDK文件已损坏所致。 为了解决这个问题,你可以尝试以下几个步骤: 1. 确保你下载的JDK文件是适用于你的操作系统架构的。如果你的操作系统是64位的,那么你需要下载64位的JDK文件,如果是32位的,那么你需要下载32位的JDK文件。 2. 检查下载的JDK文件是否已损坏。你可以重新下载文件,并检查其完整性。可以使用MD5或SHA校验和工具验证文件的完整性。 3. 确保你有执行JDK进制文件的权限。你可以使用命令`chmod +x /usr/local/jdk/jdk-17.0.1/bin/java`给予执行权限。 4. 检查系统环境变量是否正确配置。你可以编辑你的.bashrc或.profile文件,并添加JDK的路径到PATH环境变量中。 5. 使用命令`java -version`来验证是否能够正确执行。如果问题仍然存在,你可以尝试重新安装JDK,并确保按照正确的步骤进行安装。 总结起来,要解决"/usr/local/jdk/jdk-17.0.1/bin/java: 无法执行进制文件"的问题,你需要确保下载的JDK文件与你的操作系统架构匹配,检查文件的完整性,给予执行权限,并正确配置系统环境变量。如果问题仍然存在,可以尝试重新安装JDK。<span class="em">1</span><span class="em">2</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值