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

Java线程中的sleep、wait和block:区别与联系详解

在Java多线程编程中,sleep()wait()阻塞(Block) 是三个容易混淆的概念。它们都涉及线程的暂停执行,但行为机制和用途截然不同。本文将通过代码示例解析它们的区别与联系。

1. 线程状态回顾

Java线程的生命周期包含以下状态(Thread.State):

  • NEW:新建未启动
  • RUNNABLE:可运行(包括运行中和就绪)
  • BLOCKED:等待监视器锁(同步阻塞)
  • WAITING:无限期等待
  • TIMED_WAITING:限时等待
  • TERMINATED:终止
2. sleep():主动暂停,不释放锁

作用:让当前线程休眠指定时间,不释放锁状态:进入TIMED_WAITING唤醒条件:时间结束、被中断(InterruptedException)。 示例

synchronized (lock) {System.out.println("Thread sleeping for 2s, holds lock");Thread.sleep(2000); // 休眠时不释放lockSystem.out.println("Thread awakes, still holds lock");
}

3. wait():释放锁,等待唤醒

作用:在同步块中释放锁,让线程等待。 状态WAITING(无参)或TIMED_WAITING(带超时)。 唤醒条件

  • 其他线程调用notify()/notifyAll()
  • 超时时间到(若设定了超时)
  • 被中断(InterruptedException

示例

synchronized (lock) {System.out.println("Thread releases lock via wait()");lock.wait(); // 释放锁,进入等待System.out.println("Thread re-acquires lock after notify");
}

4. Blocked:竞争锁失败

触发条件:线程试图获取已被其他线程持有的锁。 状态BLOCKED唤醒条件:锁被释放时,系统自动调度竞争。 示例

// 线程A
synchronized (lock) {Thread.sleep(3000); // 持有锁3秒
}// 线程B
synchronized (lock) { // 若线程A未释放锁,线程B在此阻塞(BLOCKED)System.out.println("Thread B acquired lock");
}

5. 三者的核心区别
特性sleep()wait()Blocked
所属类ThreadObject系统自动触发
锁行为不释放锁释放锁因未获锁而阻塞
调用条件任意场景必须在同步块中竞争同步锁失败
状态TIMED_WAITINGWAITING/TIMED_WAITINGBLOCKED
唤醒方式超时或中断notify()或超时或中断锁可用时由系统分配
是否需要同步不需要必须在synchronized
6. 联系与协作
  • wait() 与 notify():经典的生产者-消费者模式中,生产者wait()释放锁,消费者notify()唤醒生产者。
  • sleep() 与 锁竞争:若sleep()的线程持有锁,其他线程会因竞争失败进入BLOCKED状态。
  • 中断响应:三者均可被interrupt()中断,抛出InterruptedException

协作示例

public class WaitSleepDemo {static final Object lock = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (lock) {try {System.out.println("Thread1: Waiting for notify...");lock.wait(); // 释放锁等待} catch (InterruptedException e) {e.printStackTrace();}}}).start();new Thread(() -> {synchronized (lock) {System.out.println("Thread2: Sleeping 1s (holds lock)");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}lock.notify(); // 唤醒等待线程System.out.println("Thread2: Notified!");}}).start();}
}

输出

Thread1: Waiting for notify...
Thread2: Sleeping 1s (holds lock)
Thread2: Notified!
Thread1: Resumed after notify

7. 总结
  • 何时用 sleep():需要暂停线程但不影响锁持有(如定时任务)。
  • 何时用 wait():需释放锁并等待条件满足(如线程协作)。
  • 理解 BLOCKED:这是被动状态,由锁竞争失败触发。

避免混淆的关键:

🔒 sleep()是“抱着锁睡觉”,wait()是“放开锁等人喊醒”,BLOCKED是“抢锁失败等开门”。

掌握这些区别能帮助开发者写出高效、安全的多线程代码,避免死锁和资源竞争问题!


文章转载自:

http://N9RB9dsv.gtgwh.cn
http://HNfFkc7E.gtgwh.cn
http://wtezRwTm.gtgwh.cn
http://Jn8QR4Nu.gtgwh.cn
http://lzNDxkqV.gtgwh.cn
http://k39T4Oc2.gtgwh.cn
http://Jn13POVi.gtgwh.cn
http://1QhgkemW.gtgwh.cn
http://rQdpmcYW.gtgwh.cn
http://RQMloohp.gtgwh.cn
http://KqpQGx4Z.gtgwh.cn
http://9lwfa1CD.gtgwh.cn
http://nCFLZF0e.gtgwh.cn
http://9O4FeQ3T.gtgwh.cn
http://frgEQU34.gtgwh.cn
http://Q7IrkkwX.gtgwh.cn
http://SW791dZo.gtgwh.cn
http://QMALnwx5.gtgwh.cn
http://8iUvlWex.gtgwh.cn
http://ldgViI7g.gtgwh.cn
http://mHNi4ac3.gtgwh.cn
http://3C2TkCoz.gtgwh.cn
http://mG7IWq8L.gtgwh.cn
http://XvygDiok.gtgwh.cn
http://8AgUPg7N.gtgwh.cn
http://tzLg7sjE.gtgwh.cn
http://ArVeRvH0.gtgwh.cn
http://DKXZsG7P.gtgwh.cn
http://uM7s70f8.gtgwh.cn
http://Mf5iehY4.gtgwh.cn
http://www.dtcms.com/a/375273.html

相关文章:

  • 生信软件管理, 容器-Singularity学习笔记
  • go webrtc - 2 webrtc重要概念
  • 智能驱动,全程可控——D-QS工程造价数字化平台核心功能深度解析
  • [硬件电路-170]:50Hz工频干扰:本质、产生机制与影响
  • tab切换动画,背景图向内收缩效果,主图片缓慢展开效果(含自适应)
  • 【内存管理】设置内存页表项 set_pte_at
  • Python中内置装饰器
  • 鸿蒙NEXT UI高性能开发实战:从原理到优化
  • 影视APP源码 SK影视 安卓+苹果双端APP 反编译详细视频教程+源码
  • Anthropic 支持加州 AI 安全法案
  • 【杂类】应对 MySQL 处理短时间高并发的请求:缓存预热
  • ubuntu 20.04 安装spark
  • 【企业微信】接口报错:javax.net.ssl.SSLHandshakeException
  • uniapp原生插件 TCP Socket 使用文档
  • 京东云-数据盘挂载
  • 【华为OD】Linux发行版的数量
  • 缓冲区漏洞详解
  • 位图转矢量图的实现方法与常用工具解析
  • 设计模式-简单工厂策略装饰器代理
  • 家庭劳务机器人发展阶段与时间预测
  • .NET 单文件程序详解:从原理到实践
  • 新能源汽车充电设备装调与检修仿真教学软件:理虚实融合实训方案
  • 小鹏汽车 vla 算法最新进展
  • C++ 20 视图view笔记
  • HTML 网页静态托管 API 接口文档(可集成到智能体Agent)
  • 在uni-app中使用lottie-web来展示Lottie动画
  • Python数据可视化基础:使用Matplotlib绘制图表
  • CodeBuddy Code深度实战:从零构建智能电商推荐系统的完整开发历程
  • 【Kubernetes知识点】PriorityClass,HPA和CICD
  • 赋能多场景创新:明远智睿H618核心板