讲师中心 微信公众号
AI工具推荐 视频效率加速

Java多线程中sleep和wait有什么区别_线程控制方法对比

云敏姑娘_2561

云敏姑娘_2561

发布时间:2026-01-01 17:20:03

|

857人浏览过

|

来源于php中文网

原创

sleep是Thread类静态方法,作用于当前线程且不释放锁;wait是Object类实例方法,必须在synchronized块内调用,会释放指定对象锁并依赖notify协作。

java多线程中sleep和wait有什么区别_线程控制方法对比

sleep 是 Thread 类的静态方法,wait 是 Object 类的实例方法

这是最根本的区别,直接决定调用方式和作用对象。sleep 操作的是当前线程本身,不依赖任何对象锁;wait 必须在已获得某个对象锁的前提下调用,且只能由该对象上调用。

常见错误现象:IllegalMonitorStateException —— 直接在没加锁的代码里写 obj.wait() 就会抛这个异常。

  • Thread.sleep(1000) 可以在任意地方调用,哪怕没 synchronized 块
  • obj.wait() 必须出现在 synchronized(obj) { ... } 内部
  • wait 会释放当前持有的 obj 锁,而 sleep 不释放任何锁
  • 两者都让线程进入 阻塞态(Blocked/Waiting),但 JVM 状态不同:sleep 进入 TIMED_WAITINGwait 进入 WAITING(或 TIMED_WAITING 如果带超时)

wait 必须配合 notify/notifyAll 使用,sleep 不需要

wait 的设计意图是线程协作:一个线程等某个条件成立,另一个线程负责“通知”。没有 notifywait 可能永远卡住;sleep 则只看时间,到期自动恢复。

使用场景差异明显:

立即学习Java免费学习笔记(深入)”;

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • 生产者-消费者模型中,消费者调用 queue.wait() 等待非空,生产者插入后调用 queue.notify()
  • sleep 更适合“延迟执行”“轮询间隔”这类单线程节奏控制,比如模拟心跳、重试退避
  • 误用 wait 而忘记 notify 是典型死锁诱因;误用 sleep 通常只是逻辑延时不准

中断行为不同:sleep 响应 interrupt,wait 也响应但需重新检查条件

两者都会被 Thread.interrupt() 打断,但处理方式有关键区别:

  • sleep 被中断时抛出 InterruptedException,并清除中断状态(Thread.interrupted() 返回 true 后变为 false)
  • wait 被中断同样抛 InterruptedException,但**不保证条件已满足**,必须放在 while 循环里重检
while (queue.isEmpty()) {
    try {
        queue.wait();
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt(); // 恢复中断状态
        return; // 或重新 throw
    }
}

漏掉 while 循环、用 if 替代,是 wait 最常见的误用——虚假唤醒(spurious wakeup)会导致线程在条件仍不满足时继续执行。

参数和超时机制表面相似,语义完全不同

sleep(long)wait(long) 都支持毫秒级超时,但含义不同:

  • Thread.sleep(5000):最多睡 5 秒,到期必醒(除非被 interrupt)
  • obj.wait(5000):最多等 5 秒,但可能提前被 notify 唤醒,也可能因虚假唤醒醒来
  • wait 的超时是协作协议的一部分,sleep 的超时是硬性时间约束
  • 性能影响上:wait/notify 涉及锁竞争和 JVM 线程调度器介入,开销略高于 sleep;但 sleep 在高频率轮询中会浪费 CPU

真正难的不是记住语法,而是判断该用哪个——看到“等别人告诉我可以继续”,选 wait;看到“我自己数三秒再干活”,选 sleep。混淆这两者,往往意味着对线程协作模型的理解还没落地到具体锁对象上。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

334

2023.09.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3438

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

989

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

303

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

479

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

329

2026.02.06

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

173

2026.03.16

Java 多线程与并发编程实战
Java 多线程与并发编程实战

深入讲解 Java 并发编程体系,涵盖 Thread / Runnable / Callable 线程创建方式、线程生命周期与状态转换、synchronized 同步锁与 Lock/ReentrantLock 显式锁、volatile 可见性保证、ThreadPool 线程池配置与调优(核心参数/拒绝策略)、JUC 并发工具类(CountDownLatch/CyclicBarrier/Semaphore/ConcurrentHashMa

289

2026.04.17

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

0

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn