3.7、Park Unpark

2024-06-12 05:32
文章标签 3.7 park unpark

本文主要是介绍3.7、Park Unpark,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基本使用

它们是LockSupport类中的方法

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

先park再unpark

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {log.debug("start...");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}log.debug("park...");LockSupport.park();log.debug("resume...");}, "t1");t1.start();Thread.sleep(2000);log.debug("unpark...");LockSupport.unpark(t1);}

输出

2022/03/06-16:04:01.033 [t1] c.Test1 - start...
2022/03/06-16:04:02.048 [t1] c.Test1 - park...
2022/03/06-16:04:03.032 [main] c.Test1 - unpark...
2022/03/06-16:04:03.032 [t1] c.Test1 - resume...

先unpark在park

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {log.debug("start...");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}log.debug("park...");LockSupport.park();log.debug("resume...");}, "t1");t1.start();Thread.sleep(1000);log.debug("unpark...");LockSupport.unpark(t1);}

输出

2022/03/06-16:07:24.562 [t1] c.Test2 - start...
2022/03/06-16:07:25.569 [main] c.Test2 - unpark...
2022/03/06-16:07:26.571 [t1] c.Test2 - park...
2022/03/06-16:07:26.571 [t1] c.Test2 - resume...

特点

与Object的wait & notify相比

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

原理

每个线程都有自己的Parker对象,由三部分组成 _counter_cond_mutex 打个比喻

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

在这里插入图片描述

  1. 当前线程调用Unsafe.park()方法
  2. 检查_counter,本情况为0,这时,获得_mutex互斥锁
  3. 线程进入_cond条件变量阻塞
  4. 设置_counter=0

在这里插入图片描述

  1. 调用Unsafe.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

这篇关于3.7、Park Unpark的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053325

相关文章

3.7 移位指令

🎓 微机原理考点专栏(通篇免费) 欢迎来到我的微机原理专栏!我将帮助你在最短时间内掌握微机原理的核心内容,为你的考研或期末考试保驾护航。 为什么选择我的视频? 全程考点讲解:每一节视频都紧扣考试要点,拒绝冗余,专注于最关键的知识点。系统且高效:我已经为你精心准备了系统的学习资料,让你不再迷茫。 🔗 点击这里观看我的视频讲解 🔗 我需要你的支持 我为这套视频投入了大量精力,希望

TensorFlow 2.1.0 + Windows 10 - 64 bit + Python 3.7 安装

先来看看TensorFlow2.1.0安装要求 那就先安装 Python3.7 !!!!!!!!!!!!! 在使用Python时,我们经常需要用到很多第三方库,例如,上面提到的Pillow,以及MySQL驱动程序,Web框架Flask,科学计算Numpy等。用pip一个一个安装费时费力,还需要考虑兼容性。 推荐直接安装 Anaconda,刚好支持Python3.7 下载-安装,一

【3.7】贪心算法-解分割平衡字符串

一、题目         在一个 平衡字符串 中, 'L'和'R'字符的数量是相同的 。给你一个平衡字符串s,请你将它分割成尽可能多的平衡字符串。         注意:分割得到的每个字符串都必须是平衡字符串。返回可以通过分割得到的平衡字符 串的 最大数量 。 示例 1: 输入:s = "RLRRL LRLRL " 输出:4 解释:s 可以分割为 "RL "、"RRL

wp-autopost-pro 3.7.8最新完美版

插件简介: 插件是wp-autopost-pro 3.7.8最新版本。 采集插件适用对象 1、刚建的wordpress站点内容比较少,希望尽快有比较丰富的内容; 2、热点内容自动采集并自动发布; 3、定时采集,手动采集发布或保存到草稿; 4、css样式规则,能更精确的采集需要的内容。 5、伪原创与翻译、代理IP进行采集、保存Cookie记录; 6、可采集内容到自定义栏目 代码下载

每日一记:windows下利用python 3.7获取电脑上所有的wifi名称和密码

之前写过一个2.7版本的,现在python都更新到3.7了,所以把代码更新了,如下: # -*- coding: UTF-8 -*-import os# 定义一个函数checkWIFI,获取电脑连接过的所有wifi名称和密码,结果以列表形式返回def checkWIFI():# 定义一个空列表,用来存放查询结果list = []# 查询所有的wifi名称message = os.popen(

java web ireport 3.7 打印二维码

前几天做项目的时候遇到一个需求,客户想在医院的诊间结算单上打印出二维码,供病人去扫描。由于现有的版本项目报表显示和打印都是用ireport 3.7来做的,还没转化成lodop打印(新版本是lodop 在那上面打印二维码轻而易举)。 原本以前打印过条形码,想着应该差不多。于是就着手做了,但是做的时候发现,ireport 的组件面板上根本没有 二维码的样式,只有条形码。

【云原生进阶之数据库技术】第二章-Oracle-原理-4.6.3.7-闪回事务查询技术

1 闪回事物查询 1.1 闪回事务查询概念介绍         闪回事务查询是通过数据字典视图flashback_transaction_query来查询历史事务相关元数据,并且可以通过该视图的undo_sql字段会给出相应的SQL从逻辑层面撤销事务。闪回事务查询实际上是闪回版本查询的一个扩充,通过它可以审计某个事务甚至 撤销 一个已经提交的事务。闪回事务查询有别于闪回查询的特点有以下3个

(3.7)进程与线程——进程环境

文章目录 1.进程的内存空间布局(1)内核空间PCB与用户空间(2)用户空间的具体布局 2.命令行参数3.环境变量表4.如何访问环境变量表?5.设置环境变量 1.进程的内存空间布局 (1)内核空间PCB与用户空间 内核空间PCB 用户空间 (2)用户空间的具体布局 2.命令行参数 (1) 命令就是可执行文件,紧跟着的参数,各种文件名等:都是命令行参数,向进

3.7通配符匹配

文章目录 1.题目2.代码 1.题目 题目要求思路: 那就是一旦p中有s中不存在的字符,那么一定无法匹配,因为星号只能增加字符,不能消除字符; p串中星号的位置很重要,用 jStar 来表示,还有星号匹配到s串中的位置,使用 iStart 来表示,这里 iStar 和 jStar 均初始化为 -1,表示默认情况下是没有星号的; 2.代码 class Solution{pu

hdu 4607 park visit 2013多校联合训练第一场

题目的大意是给你一棵树 ,相连节点之间的距离为一,让你找出一个路线访问到k个不同节点 (一条边在这个路径中可以被走多次),问你这样这个路径的距离最小值是多少?   转化之后其实就是要找出数的直径即任意2点间的最大距离,一种方法是任取一个节点做一次广搜找出其最长的子树,然后以该子树的最远的叶子上的节点作为起点再做一次广搜之后得到的最长子树的长度就是树的直径了 对于要访问的点的个数k 小于等于树