博客
关于我
java并发学习20:park与unpark
阅读量:308 次
发布时间:2019-03-04

本文共 865 字,大约阅读时间需要 2 分钟。

1、基本使用

它们是 LockSupport 类中的方法

// 暂停当前线程LockSupport.park();// 恢复某个线程的运行LockSupport.unpark(暂停线程对象)

先 park 再 unpark

2、特点

与 Object 的 wait & notify 相比

  • wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必
  • park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么【精确】
  • park & unpark 可以先 unpark,而 wait & notify 不能先 notify

3、原理

每个线程都有自己的一个Parker对象,由三部分组成_counter,_cond和_mutex打个比喻

  • 线程就像一个旅人,Parker就像他随身携带代背包,条件变量就好比背包中的帐篷。_counter就好比背包中的备用干粮(0为耗尽,1为充足)
  • 调用park就是要看需不需要停下来歇息
    • 如果备用干粮耗尽,那么钻进帐篷歇息
    • 如果备用干粮充足,那么不需停留,继续停留
  • 调用unpark,就好比令干粮充足
    • 如果这时线程还在帐篷,就唤醒让他继续前进
    • 如果这时线程还在运行,那么下次他调用park时,仅是消耗掉备用干粮,不需停留继续前进
      • 因为背包空间有限,多次调用unpark仅会补充一份备用干粮

4、流程例子

在这里插入图片描述

1)调用Unsage.unpark(Thread_0)方法,设置_counter为1

2)唤醒_cond条件变量中的Thread_0

3)Thread_0恢复运行

4)设置_counter为0

在这里插入图片描述

1)调用Unsafe.unpark(Thread_0)方法,设置_counter为1

2)当前线程调用Unsafe.park()方法

3)检查_counter,本情况为1,这时线程无需阻塞,需要运行

4)设置_counter为0

转载地址:http://cxlq.baihongyu.com/

你可能感兴趣的文章
编写测试用例的实用小技巧
查看>>
c语言贪吃蛇控制台版
查看>>
报错:在IDEA中springboot项目操作数据库,配置文件驱动com.mysql.cj.jdbc.Driver标红
查看>>
redis报错(error) NOAUTH Authentication required.解决办法
查看>>
【树形dp】P1273 有线电视网
查看>>
【最短路】P4408 [NOI2003]逃学的小孩
查看>>
2020电工(初级)考试及电工(初级)考试软件
查看>>
2020N1叉车司机模拟考试题库及N1叉车司机复审模拟考试
查看>>
2020年制冷与空调设备运行操作答案解析及制冷与空调设备运行操作考试总结
查看>>
2020年保育员(初级)考试资料及保育员(初级)新版试题
查看>>
2020年茶艺师(高级)考试内容及茶艺师(高级)考试申请表
查看>>
2021年重氮化工艺考试题库及重氮化工艺考试报名
查看>>
2021年车工(高级)考试总结及车工(高级)试题及答案
查看>>
2021年压力焊证考试及压力焊实操考试视频
查看>>
2021年低压电工考试及低压电工考试申请表
查看>>
2021年低压电工考试及低压电工考试申请表
查看>>
2021年A特种设备相关管理(电梯)考试APP及A特种设备相关管理(电梯)复审考试
查看>>
2021年N1叉车司机考试题及N1叉车司机复审模拟考试
查看>>
2021年T电梯修理考试技巧及T电梯修理模拟考试软件
查看>>
CodeBlocks开发wxWidgets环境配置详细
查看>>