当前位置: 首页 > news >正文

问:JAVA中唤醒阻塞的线程有哪些?

在Java中,唤醒阻塞线程的方法有多种,以下是常见的线程唤醒方法。

唤醒方法

  1. 使用notify()和notifyAll()方法
synchronized (obj) {obj.notify(); // 唤醒单个等待线程// obj.notifyAll(); // 唤醒所有等待线程
}
  1. 使用interrupt()方法
Thread thread = new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {System.out.println("Thread is interrupted");}
});thread.start();
thread.interrupt(); // 中断线程,唤醒阻塞
  1. 使用LockSupport.unpark()方法
Thread thread = new Thread(() -> LockSupport.park()); // 线程阻塞thread.start();
LockSupport.unpark(thread); // 唤醒阻塞线程
  1. 使用Condition的signal()和signalAll()方法
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();new Thread(() -> {lock.lock();try {condition.await(); // 线程等待} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}
}).start();// 唤醒线程
lock.lock();
try {condition.signal(); // 或使用condition.signalAll();
} finally {lock.unlock();
}
  1. 使用Semaphore的release()方法
Semaphore semaphore = new Semaphore(0);new Thread(() -> {try {semaphore.acquire(); // 线程阻塞} catch (InterruptedException e) {e.printStackTrace();}
}).start();semaphore.release(); // 释放许可,唤醒线程
  1. 使用CountDownLatch的countDown()方法
CountDownLatch latch = new CountDownLatch(1);new Thread(() -> {try {latch.await(); // 线程阻塞} catch (InterruptedException e) {e.printStackTrace();}
}).start();latch.countDown(); // 计数减一,唤醒线程

差异

方法工作原理适用场景优点缺点使用场景示例
notify()/notifyAll()唤醒等待线程需要在synchronized块中使用,适用于简单等待/通知模式简单易用,直接唤醒容易导致死锁,不可中断等待生产者-消费者问题
interrupt()中断线程适用于任何阻塞状态(如sleep, wait, join)可中断线程,灵活性强需要处理InterruptedException异常长时间等待时中断线程
LockSupport.unpark()唤醒指定线程不依赖于锁,可灵活控制线程不需要持有锁,性能较好可能导致未预期的行为,如重复唤醒需要精确控制线程唤醒时
Condition.signal()/signalAll()唤醒等待条件线程适用于更复杂的等待/通知模式,与Lock配合使用更灵活,可精确控制唤醒条件需要持有锁,可能导致死锁复杂的生产者-消费者问题
Semaphore.release()释放许可唤醒线程适用于控制资源访问的并发数量可控制并发数,灵活性强需要管理许可数量,可能导致资源泄露资源池,限流器
CountDownLatch.countDown()计数减一唤醒线程适用于等待多个线程完成后再执行后续操作可精确控制线程等待数量不可重用,一次性使用多线程并行计算后汇总结果

结语

  • notify()/notifyAll():这两个方法用于唤醒在对象监视器上等待的线程。notify()唤醒单个线程,notifyAll()唤醒所有线程。它们必须在synchronized块中使用,因为依赖于对象锁。

  • interrupt()interrupt()方法用于中断线程,如果线程在等待、休眠或其他阻塞状态,会抛出InterruptedException异常,从而唤醒线程。这种方法灵活性强,可以中断任何阻塞状态的线程。

  • LockSupport.unpark()LockSupport提供了更底层的线程阻塞和唤醒原语。unpark()方法可以唤醒处于阻塞状态的指定线程,不依赖于对象锁,因此使用更简单灵活。

  • Condition.signal()/signalAll()Condition接口提供了更灵活的线程等待/通知模式。与Lock配合使用,可以精确控制唤醒条件,适用于更复杂的并发场景。

  • Semaphore.release()Semaphore是一种计数信号量,用于控制对资源的并发访问数量。release()方法释放一个许可,从而唤醒等待资源的线程。

  • CountDownLatch.countDown()CountDownLatch是一种同步帮助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程等待。countDown()方法递减计数器的值,当计数到达零时,唤醒所有等待的线程。

相关文章:

问:JAVA中唤醒阻塞的线程有哪些?

在Java中,唤醒阻塞线程的方法有多种,以下是常见的线程唤醒方法。 唤醒方法 使用notify()和notifyAll()方法 synchronized (obj) {obj.notify(); // 唤醒单个等待线程// obj.notifyAll(); // 唤醒所有等待线程 }使用interrupt()方法 Thread thread n…...

Github Webhook触发Jenkins自动构建

1.功能说明 Github Webhook可以触发Jenkins自动构建,通过配置Github Webhook,每次代码变更之后(例如push操作),Webhook会自动通知Jenkins服务器,Jenkins会自动执行预定义的构建任务(如Jenkins …...

ESP32-WROOM-32 [创建AP站点-客户端-TCP透传]

简介 基于ESP32-WROOM-32 开篇(刚买), 本篇讲的是基于固件 ESP32-WROOM-32-AT-V3.4.0.0(内含用户指南, 有AT指令说明)的TCP透传设置与使用 设备连接 TTL转USB线, 接ESP32 板 的 GND,RX2, TX2 指令介绍 注意,下面指…...

新闻文本分类识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+TensorFlow+Django网页界面

一、介绍 文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集(“体育类”, “财经类”, “房产类”, “家居类”, “教育类”, “科技类”, “时尚类”, “时政类”, “游戏类”, “娱乐类”),然…...

Java使用Map数据结构配合函数式接口存储方法引用

Java使用Map数据结构配合函数式接口存储方法引用 背景 需求中存在这样一直情况 一个国家下面有很多的州 每个州对应的计算日期方法是不同的 这个时候 就面临 可能会有很多if else 为了后期维护尽量还是不想采用这个方式,那么就可以使用策略模式 但是 使用策略带来的…...

LeetCode:2207. 字符串中最多数目的子序列(Java)

目录 2207. 字符串中最多数目的子序列 题目描述: 实现代码与解析: 遍历: 原理思路: 2207. 字符串中最多数目的子序列 题目描述: 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 p…...

win10开机自启动方案总汇

win10开机自启动方案总汇 一、开始文件目录添加二、添加注册表启动程序三、服务启动3.1. 将程序注册为服务使用命令行创建服务设置服务启动类型启动服务 3.2. 使用 Windows 服务管理器配置服务3.3. 删除服务 四、定时任务或程序4.1 设置程序自启动(使用任务计划程序…...

【自动驾驶】基于车辆几何模型的横向控制算法 | Stanley 算法详解与编程实现

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…...

微服务--初识MQ

在微服务架构中,MQ(Message Queue,消息队列)作为一种重要的通信机制,扮演着至关重要的角色。 MQ,即消息队列,是一种在不同服务或系统之间传递消息的中间件。它允许消息的发送者(生产…...

车辆识别数据集,图片数量20500,模型已训练200轮

车辆识别数据集(Vehicle Recognition Dataset, VDRD) 摘要 VDRD 是一个专为车辆识别设计的大规模数据集,它包含了20500张不同类型的汽车、货车、公交车以及其他类型车辆的图像。数据集提供了四种车辆类别:汽车、货车、其他车辆和…...

MES系统如何提升制造企业的运营效率和灵活性

参考拓展:苏州稳联-西门子MES系统-赋能智能制造的核心引擎 制造执行系统(MES)在提升制造企业运营效率和灵活性方面发挥着关键作用。 一、MES系统的基本概念和功能 MES系统是连接企业管理层与生产现场的重要桥梁。它主要负责生产调度、资源管理、质量控制等多个方…...

Nexpose 6.6.270 发布下载,新增功能概览

Nexpose 6.6.270 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 18, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…...

【数据库】sqlite

文章目录 1. 基本概述2. 主要特点3. 应用场景4. 优缺点5. 基本使用示例6. 在编程语言中的使用连接到 SQLite 数据库(如果文件不存在会自动创建)创建表插入数据提交事务查询数据关闭连接 7. 总结 SQLite 是一个轻量级的关系型数据库管理系统(R…...

详解 C++中的模板

目录 前言 一、函数模板 1.定义 2.函数模板的实现 3.模板函数的实例化 4.模板参数的省略 1.函数模板的实参推导 2.类模板的实参推导 3.默认模板参数 4.特殊情况:无法推导的模板 5.推导失败的情况 二、类模板 1.概念和定义 2.类模板定义 3.类模板的使用 4.类模板…...

基于DAMODEL——Faster-RCNN 训练与测试指南

Faster-RCNN 训练与测试指南 前言 今天我们要来实现一个经典的目标检测模型:Faster-Rcnn。我们使用DAMODEL云平台来实现,这是个很强大的云端平台,功能众多,你可以投你所好去进行你想做的事情。 1. 环境与工具准备 1.1 远程连接…...

考研数据结构——C语言实现冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较每对相邻元素,并在顺序错误的情况下交换它们。这个过程重复进行,直到没有需要交换的元素,这意味着列表已经排序完成。冒泡排序的名字来源于较小的元素会逐…...

labview更换操作系统后打开原VI闪退

labview更换操作系统后打开原VI闪退 问题描述: Windows11由家庭版更换为专业版后,重新安装labview2021,打开原来的项目,项目管理器可以正常打开,但是打开VI却闪退,并报错如下 出现这种原因主要是labview在…...

什么是CAPTCHA?有什么用途?

一、CAPTCHA 的工作原理 CAPTCHA的核心目的是通过呈现人类可以轻松理解但计算机程序难以解决的任务,来阻止恶意的自动化工具。传统的CAPTCHA通过展示扭曲或模糊的文字、图片或者点击操作等,要求用户完成验证任务。这些任务通常需要视觉、听觉或简单的逻辑…...

在虚幻引擎中创建毛发/头发

在虚幻引擎中创建毛发/头发 , 首先开启两个插件 Groom 和 Alembic Groom Importer 打开蒙皮缓存 导出人物模型 将人物导入Blender , 选择需要种植头发的点 指定并选择 点击毛发 这里变成爆炸头了 , 把数量和长度调一下 切换到梳子模式 调整发型 导出为abc , 文件路径不…...

PHP API 框架:构建高效API的利器【电商API接口】

在当今快速发展的互联网时代,API(应用程序编程接口)已成为连接不同应用程序和服务的关键。PHP,作为一种流行的服务器端脚本语言,提供了多种强大的框架来简化API的开发。本文将介绍PHP API框架的重要性,以及…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...