【JUC】09-线程等待与唤醒

news/2024/9/14 16:30:59/ 标签: java, 开发语言

1. Object wait和notify实现等待与唤醒

没有锁会报错。

java">public class demo01 {public static void main(String[] args) {Object objectLock = new Object();new Thread(()->{synchronized (objectLock) {try {// 释放当前锁, 等待notify, 必须先使用wait才能使用notifyobjectLock.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("Thread 1");}}).start();new Thread(()->{synchronized (objectLock) {System.out.println("Thread 2");objectLock.notify();}}).start();}
}

2. Lock.newCondition await和signal实现等待与唤醒

java">public class demo02 {public static void main(String[] args) {Lock lock = new ReentrantLock();Condition condition = lock.newCondition();new Thread(()->{lock.lock();try {// 释放锁并等待通知condition.await();System.out.println("Thread 1");} catch (InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}}).start();new Thread(()->{lock.lock();System.out.println("Thread 2");condition.signal();lock.unlock();}).start();}
}

3. LockSupport park和unpark实现等待与唤醒

unpark只能产生一个permit,且可以提前产生,

java">public class demo03 {public static void main(String[] args) {Thread thread = new Thread(() -> {try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {throw new RuntimeException(e);}// 可以先进行 unpark, 并且 permit 只能有一个// 需要两个permitLockSupport.park();LockSupport.park();System.out.println("Thread1");});thread.start();new Thread(()->{System.out.println("Thread 2");// 只会产生一个permitLockSupport.unpark(thread);LockSupport.unpark(thread);}).start();}
}

http://www.ppmy.cn/news/1519449.html

相关文章

fpga图像处理实战-双线性插值算法

FPGA实现 `timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2024/08/29 19:10:23 // Design Name: // Module Name: image_line_buffer // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Re…

Docker使用指南:从入门到实践

Docker是一种开源的容器化技术,旨在为开发人员和系统管理员提供一种轻量级、可移植的环境,以便于应用程序的开发、部署和运行。通过Docker,你可以将应用程序及其依赖项打包在一个可移植的容器中,并在任何环境中一致地运行。本文将…

七. 部署YOLOv8检测器-load-save-tensor

目录 前言0. 简述1. 案例运行2. 补充说明3. 代码分析3.1 main.cpp3.2 create_data.py 结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习课程第六章—部署分类器&…

kali——nikto的使用

目录 前言 使用方法 查看帮助(--help) 常规扫描(-h) 指定端口扫描(-h -p) 目录猜解(-h -C) 扫描敏感目录(-h) 保存扫描信息 前言 linux自带的nikto工…

PDF-Extract-Kit提取PDF数据

链接: https://github.com/opendatalab/PDF-Extract-Kit 记录一下 首先是clone该项目, 然后新建一个虚拟环境 进入环境,进入项目 https://github.com/opendatalab/PDF-Extract-Kit?tabreadme-ov-file#installation-guide 如果报错没有PIL…

【HarmonyOS NEXT开发】鸿蒙开发环境准备,ArkTS基础语法入门

文章目录 鸿蒙开发环境准备,ArkTS基础语法入门大纲简介DevEco Studio简介运行环境要求 安装与配置开发工具下载Harmony OS 和 OpenHarmony 的区别Previewer汉化插件的配置 ArkTS基础快速入门1. 解释说明2. 变量与常量3. 变量命名规则4. 数组5. 函数定义函数调用函数…

19. 排序dataframe:掌握这些技巧,让你的数据更有序

哈喽,大家好,我是木头左! 使用sort_values()函数进行排序 Pandas库提供了sort_values()函数,用于对dataframe进行排序。该函数的基本语法如下: df.sort_values(by, axis0, ascendingTrue, inplaceFalse, kindquickso…

C语言典型例题58

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.10 求100~200中的全部素数。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题4.10 求100~200中的全部素数。#include <stdio.h> #include <math.h>int m…

k8s ingress-nginx

ingress-nginx 基于域名7层代理 1.安装 # 仓库下载 helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm pull ingress-nginx/ingress-nginx# 导入ningress-nginx [rootmaster 2、ingress-nginx]# tree -l . ├── chart │ └── ingress-ng…

jsmn输出

对应c程序&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include "jsmn.h"#define my_printf(format, ...) printf(format, ##__VA_ARGS__) //#define my_printf(format, ...) typedef unsigned char uint8_t; typed…

docker部署流程

1、安装python容器 docker pull python:3.12.4 2、挂载本地目录及容器目录并分配一个伪输入输出&#xff0c;进入容器命令行 docker run -it --name pytest -v /Users/python_work/ai:/root/text_similar python:3.12.4 bash 3、拉取python项目需要依赖包 pip3 install XXX …

FAISS 索引

FAISS&#xff08;Facebook AI Similarity Search&#xff09;是一个由 Facebook 开发的开源库&#xff0c;用于高效的相似性搜索和密集向量的聚类。它非常适合处理大规模的向量搜索任务&#xff0c;例如推荐系统、图像搜索、自然语言处理中的嵌入搜索等。 FAISS 文件概述 FAI…

UE5开发——射击武器类拾取

整体框架&#xff1a; 拾取武器 要在 Unreal Engine 5 (UE5) 中实现一个按 E 键拾取武器的功能&#xff0c;您可以遵循以下步骤&#xff1a; ### 步骤 1: 创建拾取物品的基础类 1. 在 Content Browser 中创建一个新的 C 类&#xff0c;继承自 AActor 或者 AStaticMeshActor。…

(学习总结15)C++11小语法与拷贝问题

C11小语法与拷贝问题 auto关键字范围forinitializer_list深拷贝与浅拷贝写时拷贝 以下代码环境为 VS2022 C。 auto关键字 在早期 C/C 中 auto 的含义是&#xff1a;使用 auto 修饰的变量&#xff0c;是具有自动存储器的局部变量&#xff0c;不过一般都会隐藏&#xff0c;导致…

Datawhale X 李宏毅苹果书 AI夏令营_深度学习基础学习心得Task2

本次学习主要针对自适应学习率&#xff1b;介绍了Adagrad&#xff0c;RMSprop和Adam优化器 1、为什么需要自适应学习率&#xff1a; 训练一个网络&#xff0c;在走到临界点的时候损失不再下降&#xff0c;而梯度并没有变得很小。相当于下坡路在两步之间&#xff0c;而步子迈大…

加载SQLite扩展的db.loadExtension方法

在Node.js环境中&#xff0c;sqlite3库为开发者提供了一个与SQLite数据库进行交互的简洁API。除了基本的数据库操作外&#xff0c;sqlite3还支持加载SQLite扩展&#xff0c;这些扩展可以提供额外的功能&#xff0c;如全文搜索、地理空间支持等。db.loadExtension方法就是用来加…

JavaScript 在 VSCode 中的开发体验

JavaScript 在 VSCode 中的开发体验 JavaScript 是一种广泛使用的编程语言,它让网页变得生动有趣。而 VSCode(Visual Studio Code)则是一款非常流行的代码编辑器,以其强大的功能和灵活性著称。在这篇文章中,我们将探讨在 VSCode 中使用 JavaScript 进行开发的体验,包括其…

Ubuntu 安装个人热点

1. 安装必要的软件 首先&#xff0c;我们需要确保有一些工具已经装好&#xff0c;这些工具会帮助我们创建 Wi-Fi 热点。打开终端&#xff0c;输入以下命令来安装这些工具&#xff1a; sudo apt-get install git hostapd iptables dnsmasq 2. 下载并安装 create_ap 我们接下来…

JavaScript 中的数组与对象

在 JavaScript 编程的浩瀚世界中&#xff0c;数组和对象作为核心的数据结构&#xff0c;扮演着至关重要的角色。它们不仅为数据的存储和操作提供了强大的工具&#xff0c;还在各种应用场景中展现出独特的魅力。 一、数组&#xff1a;有序的数据集合 数组是一组有序的数据集合…

51单片机——模块化编程

1、模块化编程介绍 传统方式编程&#xff1a;所有的函数均放在main.c里&#xff0c;若使用的模块比较多&#xff0c;则一个文件内会有很多的代码&#xff0c;不利于代码的组织和管理&#xff0c;而且很影响编程者的思路。 模块化编程&#xff1a;把各个模块的代码放在不同的.…