多线程学习篇六:park / unpark

1. API

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

1.1 先 park 再 unpark

main 线程睡眠时间大于 t1 线程睡眠时间

@Slf4j(topic = "c.Test01")
public class Test01 {

    public static void main(String[] args) throws Exception {

        Thread t1 = new Thread(() -> {
            log.info("start...");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            log.info("park...");
            LockSupport.park();

            log.info("resume...");
        }, "t1");
        t1.start();

        TimeUnit.SECONDS.sleep(2);

        log.info("unpark... ");
        LockSupport.unpark(t1);
    }
}

通过运行结果得出结论:阻塞的线程在执行 unpark 方法后,恢复运行

1.2 先 unpark 再 park

main 线程睡眠时间小于 t1 线程睡眠时间

@Slf4j(topic = "c.Test01")
public class Test01 {

    public static void main(String[] args) throws Exception {

        Thread t1 = new Thread(() -> {
            log.info("start...");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            log.info("park...");
            LockSupport.park();

            log.info("resume...");
        }, "t1");

        t1.start();

        TimeUnit.SECONDS.sleep(1);

        log.info("unpark... ");
        LockSupport.unpark(t1);
    }
}

通过运行结果得出结论:如果 t1 线程在执行 park 方法之前执行了 unpark 方法,park 方法不能让 t1 线程进入阻塞状态

1.3 执行多次 unpark 再 park

@Slf4j(topic = "c.Test02")
public class Test02 {

    public static void main(String[] args) throws Exception {

        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        Thread t1 = new Thread(() -> {
            log.info("start...");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            log.info("park1...");
            LockSupport.park();

            log.info("park2...");
            LockSupport.park();

            log.info("resume...");
        }, "t1");
        t1.start();

        TimeUnit.SECONDS.sleep(1);

        log.info("unpark : " + LocalDateTime.now().format(dateTimeFormatter));
        LockSupport.unpark(t1);

        log.info("unpark : " + LocalDateTime.now().format(dateTimeFormatter));
        LockSupport.unpark(t1);

        TimeUnit.SECONDS.sleep(3);

        log.info("unpark : " + LocalDateTime.now().format(dateTimeFormatter));
        LockSupport.unpark(t1);
    }
}

通过运行结果得出结论:如果 t1 线程在执行 park 方法之前执行了多次 unpark 方法,第一次执行 park 方法不进入阻塞状态,再一次执行 park 方法将进入阻塞状态

1.4 小结

  • 如果一个运行的线程在执行 park 方法之前,未执行 unpark 方法,线程进入阻塞状态
  • 如果一个运行的线程在执行 park 方法之前,执行了一次或多次 unpark 方法,线程不进入阻塞状态,而是继续向下运行

2. park & unpark 与  wait & notify & notifyAll 的区别

  • wait & notify & notifyAll 需要和 synchronized 关键字一起使用,而 park & unpark 不需要
  • park & unpark 会阻塞(唤醒 )指定线程,而 notify 只能随机唤醒一个等待线程,notifyAll 唤醒所有等待线程
  • park & unpark 可以先 unpark 再 park,给线程一次 “免阻塞” 的机会,而 wait & notify & notifyAll 不可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904905.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

传承双百基因 大将军F9轻松跑“盈”脐橙创富路

“江作青罗带,山如碧玉簪。”广西河池,地处桂林西北一隅,奇秀的喀斯特地貌纵横绵延,亚热带季风气候温润宜人,堪称种植脐橙的“天选之地”。 正值秋季,这里漫山遍野,“橙”香四溢,大量…

一图看懂亚信安全2024年三季度财报

一图看懂亚信安全2024年三季度财报, 2024年前三季度营收创历史新高, 净利润、经营现金流加速增长! (相关信息主要摘自亚信安全2024年三季度财报, 如存在差异,以亚信安全2024年三季度财报为准。&#xff0…

arm 体系架构-过程调用标准AAPCS

一、什么是AAPCS? 旧时,ARM 过程调用标准叫做 APCS (ARM Procedure Call Standard),Thumb的过程调用标准为 TPCS。如今这两种叫法已经废弃,统一称作 AAPCS (Procedure Call Standard for the ARM Architecture)。 AAPCS 是 ARM …

Kubernetes运行大数据组件-运行spark

部署组件 ● spark-historyserver ● spark-client 配置文件 kind: ConfigMap apiVersion: v1 metadata:name: spark data:spark-defaults.conf: |-spark.eventLog.enabled truespark.eventLog.dir hdfs://192.168.199.56:8020/eventLogsspark.ev…

STM32FreeRTOS 使用QSPI驱动nandFlash

STM32FreeRTOS 使用QSPI驱动nandFlash 不清楚为什么STM32同时打开3个以上的音频文件时会出现播放问题,所以更换方案。因为SRAM的内存空间过小,用于存储音频文件不适合,所以使用大小为128MByte的nandFlash。 nandFlash使用华邦的W25N01GVZEI…

Nature Communications|综述|无线胶囊内窥镜机器人的最新研究进展和未来发展方向(健康监测/柔性传感/可吞服电子)

浙江大学杨华勇(Huayong Yang)院士和韩冬( Dong Han)特聘研究员团队,在期刊《Nature Communications》上发布了一篇题为“Robotic wireless capsule endoscopy: recent advances and upcoming technologies”的综述论文,博士生曹青(Qing Cao)为论文第一作者。综述内容如…

群控系统服务端开发模式-应用开发-安装及提交仓库

整个应用采用的是现有的流行模式,前后分离。应用架构前端采用vue-element-admin,API接口采用的是thinkphp6,数据库采用的是MySQL5.7.36,而事件处理我采用的是分布式队列rabbitMQ。 首先安装及调整API接口系统业务架构逻辑。根据《…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器(做梦),你的导师让你学习部署并且训练不同尺寸的大模型,并且写一个说明文档。你意识到,你最需要学习的就是关于分布式训练的知识,因为你可是第一次接触这么多卡…

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(一)认识和了解Build.cs

目录 引言 一、创建一个C插件TextureReader插件 二、Build.cs文件 三、ModuleRules 四、TextureReader插件的构造 4.1ReadOnlyTargetRules的作用 4.2TextureReaderd的构造调用 4.3设置当前类的预编译头文件的使用模式 4.4PublicIncludePaths.AddRange与PrivateInclude…

揭秘世界技能大赛健康与社会照护项目,对智慧养老专业建设的启示

一、世界技能大赛(世赛):职业技能的巅峰对决 被誉为“职业技能奥林匹克”的世界技能大赛是全球最高水平的职业技能竞赛,代表着各行业职业技能发展的国际先进水平。赛事涵盖六大领域:建筑与工程技术、创意艺术与时尚、…

【Unity】鼠标点击获取世界坐标位置:物体移动至鼠标点击的位置

需求说明 鼠标点击3D场景时,可以获取其所在的世界坐标; 鼠标点击3D物体时,可以获取该物体; 鼠标点击3D物体时,可以让玩家移动至该物体; 成果展示 Scene部分 关于仓库栏的设置,物体如何进入…

搭建支持国密GmSSL的Nginx环境

准备 1、服务器准备:本文搭建使用的服务器是CentOS 7.6 2、安装包准备:需要GmSSL、国密Nginx,可通过互联网下载或者从 https://download.csdn.net/download/m0_46665077/89936158 下载国密GmSSL安装包和国密Nginx安装包。 服务器安装依赖包…

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion论文阅读笔记

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion 论文阅读笔记 这是ECCV2024的论文,作者单位是是港中文和上海AI Lab 文章提出了一个叫AutoDIR的方法,包括两个关键阶段,一个是BIQA,基于vision-language…

如何查看磁盘的类型?(固态硬盘 or 机械硬盘)

按一下电脑的win键 直接打字搜索:【碎片整理和优化驱动器】 , 然后按一下【回车】或者 鼠标点击选择即可 如下位置:【媒体类型】显示的即是:【固态硬盘】or【机械硬盘】

解决pycharm无法添加conda环境的问题【Conda Environment下没有Existing environment】

解决pycharm无法添加conda environment 问题【Conda Environment下不显示Existing environment】 问题: 第一次下载好pycharm准备编写代码,在Anoconda Prompt建立好环境后,打开pycharm导入环境,却发现在【Conda Environment】处…

使用AIM对SAP PO核心指标的自动化巡检监控

一、背景 由于SAP PO系统维护成本较高,各类型异常报错等都需要人员进行时刻监控和响应,遂由AIM平台进行自动化巡检SAP PO的各指标,然后告警通知用户,节省维护成本和提高工作效率 二、核心指标监控 SAP PO失败消息 适用于S…

基于Python的A*算法实现路径规划

目录 一、A*算法 二、算法具体步骤 三、算法基本程序流程 四、算法代码实现 五、运行结果 一、A*算法 A*(A-Star)算法是P.E.Hart、N.J.Nilsson和B.Raphael等人在1986年综合Dijkstra算法和BFS算法的优点而提出来的一种非常有效的启发式路径搜索算法…

和鲸科技 CEO 范向伟受邀揭牌启动南京大学 2024 级大学生人工智能素养大赛

2024 年 10 月 26 日,南京大学第十九届读书节在仙林校区图书馆举行开幕仪式。中国科学院院士、南京大学校长谈哲敏,校党委常委、副校长索文斌,原副校长、关工委主任闵铁军出席仪式,南京大学相关学院和职能部处负责人,以…

有序序列合并(c语言)

代码实例 int main() {int n 0;int m 0;scanf("%d %d", &n, &m);//n输入第一个升序数组中的元素个数//m输入第二个升序数组中的元素个数//创建数组//arr1为n对应的数组int arr1[1000];//arr2为m对应的数组int arr2[1000];//arr3为数组1与数组2结合后的数组…

Java审计对比工具JaVers使用

最近有个需求,需要将页面的内容生成excel或者word文档,而且每次的修改都需要生成新的版本,同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象,同时存储到数据库一条新数据,对应数据表一…