park()、unpark()简单说明:

LockSurport中park()执行时会判断当前线程是否有"许可"(初始化的线程没有"许可"),若没有"许可"则会阻塞(阻塞期间获得"许可"会跳出阻塞且不抛出InterruptedExcetion异常),若有"许可"则会直接跳过阻塞(不抛出InterruptedExcetion异常)执行后续代码。

LockSurport中unpark(Thread thread)执行时会给thread一个"许可",多次执行也只有一个"许可"。

需注意的点:

1. 许可消耗后当前线程就不在拥有"许可",再次调用park()会阻塞。

2. park()、unpark()不分先后顺序。

本文重点:

调用park()的线程可以被interrupt()方法打断,park()进入时首先会判断当前线程是否有"许可",然后判断是否被打断。

如果线程没有被打断则正常判断是否有"许可",过程与以上park()方法介绍一致;

如果线程被打断则先判断是否有"许可",若有"许可"则消费掉"许可"然后直接跳出阻塞,若没有许可则直接跳出阻塞且不抛出InterruptedException并且也不会将中断状态设置为false,所以如果线程被打断,连续调用park()方法线程也不会被阻塞住(可以理解为park()方法失效)。若想重新生效park()方法需要重置中断状态为false;

----------------------------------------------------分割线---------------------------------------------------------

线程被打断后park()失效演示:

打断后使park()重新生效演示(注意左下角运行图标,线程没有结束,被阻塞住了):

验证拥有"许可"时被打断是先消费"许可"还是先判断打断状态:

注意左下角,线程被阻塞住了。也就是说第一个park()方法先消费了"许可",导致中断状态被重置后第二个park()方法生效阻塞住,因为没有"许可"所以一直阻塞下去。

论证:

如果是第一个park()方法因为先响应了中断而没有消费"许可",则第二个park()方法就不会在中断状态重置后阻塞住而是会消费掉"许可"结束程序。

为了避免unpark()和interrupt()方法的执行顺序影响造成歧义,我们修改一下他们的代码顺序看下执行结果:

也就是验证了以上结论。

LockSurport中park()、unpark()和Thread中interrupt()的区别与联系相关推荐

  1. Java中的锁-park/unpark

    park与unpark 在使用park与unpark的时候就在疑惑为什么先调用unpark时后park就不会阻塞,现在就总结一下原理 @Slf4j public class ParkAndUnpark ...

  2. java lock park_java并发编程-LockSupport中park与unpark基本使用与原理简单分析

    文章目录 java并发编程原理之---park与unpark 基本使用 情况一,先park再unpark,代码举例与分析 情况二,先unpark再park,代码举例与分析 特点 原理之park &am ...

  3. Java中Thread中的实例方法_Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  4. Java多线程3:Thread中的静态方法

    Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...

  5. Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  6. java中thread实例_Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  7. java中u怎么用_Java中interrupt的使用

    通常我们会有这样的需求,即停止一个线程.在java的api中有stop.suspend等方法可以达到目的,但由于这些方法在使用上存在不安全性,会带来不好的副作用,不建议被使用.具体原因可以参考Why ...

  8. Java线程中的静态方法_Java多线程3:Thread中的静态方法

    Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...

  9. 在Android中使用Handler和Thread线程执行后台操作

    在 Android中使用Handler和Thread线程执行后台操作 对于线程的控制,我们将介绍一个 Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Message和Runn ...

最新文章

  1. 静态库和共享库之间的区别?
  2. rmi 反序列化漏洞_提醒:Apache Dubbo存在反序列化漏洞
  3. 【图像分类】从数据集和经典网络开始
  4. 苹果手机home键在哪里_苹果手机为什么没有返回键?原来隐藏着更好的方法,涨知识了...
  5. Gerrit的用法及与gitlab的区别
  6. python 画出决策边界_Python3入门机器学习 - 逻辑回归与决策边界
  7. 【Web缓存机制系列】2 – Web浏览器的缓存机制
  8. 领域驱动实践总结(基本理论总结与分析+架构分析与代码设计V+具体应用设计分析)
  9. Excel基础知识(10):多工作簿数据的引用与更新
  10. 前端中那些让你头疼的英文单词
  11. Please make sure that the app id is set correctly.
  12. 充值校园卡显示服务器异常,调查| 为何这次校园卡系统故障时间这么长?
  13. 【Linux应用】Clonezilla使用指南
  14. mysql是网状_三种数据模型---层次模型、网状模型以及关系模型
  15. 解决问题:Matlab如何生成或保存无背景图片
  16. C++ 将字符串转换为浮点数
  17. 统计学基本知识(四)
  18. HITCSAPP大作业 2021 春
  19. 【python学习】Python开心消消乐实现过程基础1
  20. 点到点的距离、点到直线的距离、点是否在直线上

热门文章

  1. ZYNQ PS-PL ILA联调注意事项
  2. 菜鸟vimer成长记——第2.1章、normal模式
  3. np.random.normal()
  4. 苹果手机群控 手机投屏 电脑控制手机鼠标键盘操控
  5. struts2-总结篇
  6. 什么是独立路径软件测试,软件测试重点之基本路径测试
  7. 一文读懂以太坊存储数据核心数据结构:MPT
  8. mybatis怎样判断list是否为空
  9. npm下载Vue-cli问题
  10. java查看内存泄露_Java内存泄露如何排查