惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
月光博客
月光博客
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
O
OpenAI News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Know Your Adversary
Know Your Adversary
Last Week in AI
Last Week in AI
S
Securelist
Engineering at Meta
Engineering at Meta
博客园 - 司徒正美
P
Privacy & Cybersecurity Law Blog
T
Tailwind CSS Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Scott Helme
Scott Helme
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hugging Face - Blog
Hugging Face - Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
Lohrmann on Cybersecurity
IT之家
IT之家
Security Archives - TechRepublic
Security Archives - TechRepublic
I
InfoQ
S
Security @ Cisco Blogs
Webroot Blog
Webroot Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Full Disclosure
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
人人都是产品经理
人人都是产品经理
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed
Apple Machine Learning Research
Apple Machine Learning Research

码云笔记

Pinia v4 发布:Vue 状态管理进入新时代 Linux LVM:故障排查与数据恢复指南 Bonsai27B 重磅落地!27B 大模型实现手机本地运行 ES2026 第 17 版新增的 5 个新特性 高德重磅上线 ABot‑World Studio,消费级显卡就能搭建专属 3D 虚拟世界 Java中final、finally和finalize的区别是什么? 怎么修改Ollama及其模型的默认路径?Ollama路径修改、迁移与重启的操作教程 iOS27 公开测试版正式上线!AI Siri 与液态玻璃成最大看点 Yuku正式发布!比 Vite+ 快 5.4 倍的前端工具链 Linux lsof 命令详解:进程与文件监控实战 Claude Code CLI命令手册 代码审查重构Bug修复场景化工作流 OpenClaw中连接并使用本地Ollama模型的操作教程 GPT-5.6 今天正式上线:OpenAI 掏出”太阳系”全家桶,Sol / Terra / Luna 齐发,打的却是一张”效率牌” Nacos MySQL持久化部署完整教程 GPT-5.6系列正式上线:OpenAI以效能与性价比重塑AI行业竞争格局 Java中序列化与反序列化的概念是什么? 如何在HTML中实现字体颜色根据背景自动变化? JDK动态代理与CGLIB动态代理的区别是什么? OpenClaw数据加密敏感信息保护的完整教程 砸超亿美元算力!亚马逊秘密启动Moonraker项目,Alexa迎来颠覆性升级 PHP 最轻量、结构化 .docx 到 Markdown 转换器 Elephant TypeScript 7.0 正式发布 蚂蚁灵波开源全球首款 MoE 具身视频大模型 LingBot-Video,为机器人世界模型搭建新底座 SpaceX AI联合Cursor推出Grok 4.5 搅动专业AI赛道格局 英伟达Vera CPU落地商用,改写AI代理时代算力竞争规则 什么是端点检测与响应(EDR)以及它的工作原理介绍 Anime.js 已经 10 岁了!作者查出脑瘤,V5 将开始收费! 星链开启全面升级!SpaceX申请十万颗卫星,构建AI时代全球天基基建 PHP 通用表达式语言 CEL-PHP 2.0.0 正式发布! WordPress 7.0 下载,支持AI建站 Docker Desktop(windows)版本下载 详解 Linux 端口监听检查工具:ss、netstat、lsof 京东 JoyAI 上线 UGC 数字人功能,普通人一键打造专属虚拟分身 Java中Integer缓存池的作用是什么? 应对劳动力短缺 日本加码布局AI机器人产业,2040年拟千万台机器人落地各行各业 Java中深拷贝与浅拷贝的区别是什么? Claude旗舰模型收费规则大变:订阅权益取消,转为按量计费 MySQL中的分布式架构和复制策略 如何在 MySQL 中处理 BLOB 和 CLOB 数据类型? 如何在 MySQL 中处理和优化长时间运行的查询? git提交信息分别用什么icon好? Composer安装与配置教程 35岁华为员工偷偷面试,被面试官嘲讽:你是被淘汰的吧?他的回怼让面试官当场闭嘴 谷歌Nano Banana 2 Lite正式上线:4秒极速出图,大幅降低AI生图成本 锐捷交换机运维配置完全参考手册 Vue 3.5:Effect Scope 与响应式污染隔离机制 IS-IS协议基本概念、工作原理与扩展应用 美团LongCat-2.0重磅开源!国产万亿参数大模型解锁超长上下文新能力 LangChain4j 和 LangGraph4j 区别是什么?哪个更好? Claude Code 的聊天和配置可以一键搬进 Codex 了 码云笔记详解Markdown格式兼容性、图片显示失效与同步冲突解决 python实现自动爬取某论坛帖子并导出到Word文档的实战教程 高德低调内测 AI 零代码工具“袋马”,切入小微商家轻量化应用开发赛道 一文看懂OSPF:基础概念、工作原理和应用场景 PHP (Yii2) 接入企业级 SSO 单点登录实战教程 Google终于支持修改Gmail邮箱了?实测告诉你哪些能改,哪些不能改!(附详细教程+FAQ) UCloud 4.6 元 / 月服务器是真的吗? 2026 云服务器完整选购攻略 Webiny:无服务器应用程序框架 Fyrox:现代化的 Rust 游戏引擎 千问发布全球首个原生语言世界模型Qwen-AgentWorld,AI智能体迈入全环境实操新时代 火山引擎上新豆包音频生成模型1.0,AI音频生成实现一键全流程创作 使用Claude Code经常遇到的10个问题 如何批量清理wordpress所有文章和标签,保留设置,保留分类? 谷歌 NotebookLM 内测文献综述矩阵工具,Gemini3.5 赋能 AI 学术结构化研究 京东开源JoyAI-VL-Interaction模型 解锁AI实时视频视觉交互新形态 破解中小商家海报设计难题!MeiGen-AI开源闭环AI设计方案落地 详解Bash set 命令:set -e、set -x 和 set -u 完全指南 Node Plus ?比 pnpm 快 24 倍! Plan-Execute-Replan 和 ReAct 的区别是什么? Anthropic最新报告揭秘:AI编程人机协作成开发者主流工作模式 详解PostgreSQL 18 逻辑复制冲突检测与解决方法 JDK动态代理与CGLIB动态代理的区别是什么? 详解 Linux 中 localhost、127.0.0.1 与 Loopback(回环地址) OpenAI Codex新手入门教程 安装配置AGENTS.md与MCP全流程详解 程序员必备AGENTS.md配置指南 规避AI编码修改乱象 使用 Codex 必装的 12 个插件,你值得拥有! macOS AI CLI工具安装与避坑指南 OpenClaw Gemini Claude报错全套解决方案 智谱AI正式开源GLM-5. 2 模型:主打1M无损上下文与长程代码任务 小米 MiMo Claw 正式版上线 轻量化 Agent 打通金山办公生态 如何定义 Vue 的动态路由?如何获取传过来的动态参数? 记录Claude Code Router 接入过程遇到问题及解决方法 千问AI眼镜凭硬核实力领跑2026智能穿戴赛道 程序员特有的习惯你占了几条! 郝景芳新作半数内容由AI创作,文坛郝景芳AI写作争议再起 使用 iftop、nload、bmon、vnstat 监控 Linux 网络带宽 现代富文本编辑器为什么最终都会抛弃 DOM? Vue 的 v-cloak 和 v-pre 指令有什么作用? 去哪里买抖音号?抖音小号在线购买-抖音小号出售批发 实名闲鱼小号出售|闲鱼账号批发|咸鱼发布账号|出售闲鱼发布账号 zfb号购买-支付宝小号购买-实名支付宝购买号-企业支付宝购买-支付宝小号批发 个人支付宝实名账号出售|v2/v3支付宝账号出售|实名支付宝小号购买 闲鱼账号哪里有卖-闲鱼实名账号购买的途径 Java注解的实现原理是什么? Agentation MemPalace 《置身钉内》之好词好句好段摘抄 AI有声书革命!万象有声全自动生产线,7元/万字颠覆网文有声化行业 详解CentOS 7跨版本迁移Rocky Linux9 生产环境安全升级教程 Java中序列化与反序列化的含义是什么? 18. Python 标准库之 Json 模块
Java中wait()与sleep()方法的不同点是什么?
小昊子 普通 · 2026-07-15 · via 码云笔记

AI 概述

wait是Object的方法,必须写在同步代码块中,调用后释放锁,依靠notify唤醒,多用于线程通信,典型应用为生产者‑消费者模式;sleep属于Thread静态方法,休眠期间不会释放锁,到期自动恢复,一般用来做延时控制。文中搭配代码示例区分二者用法,同时讲到二者需要处理中断异常,长时间sleep容易引发死锁问题,开发中应当合理选择,规避多线程阻塞隐患。

目录

文章目录隐藏

  1. wait() 方法的工作原理
  2. sleep() 方法的工作原理
  3. 知识拓展
  4. 总结

Java 中 wait()与 sleep()方法的不同点是什么?

Java 多线程开发中,wait()sleep()极易被混淆,二者底层机制差别巨大。本文分别讲解 wait() 属于 Object 成员方法、休眠释放锁,sleep() 是 Thread 静态方法、休眠不释放锁的核心原理,搭配代码示例对比用法,结合生产者‑消费者模型介绍实际场景,同时梳理使用规范以及死锁等安全隐患。

wait() 方法是 Object 类中的一个方法,它用于使当前线程进入等待状态。调用 wait() 的线程会进入一个阻塞状态,直到其他线程调用同一个对象的 notify() 或 notifyAll() 方法来唤醒它。需要注意的是,wait() 方法必须在 同步代码块 或 同步方法 中调用,因为它会释放对象的锁。

wait() 方法的关键特性

  1. 释放锁:调用 wait() 后,当前线程释放它所持有的锁,这样其他线程可以进入该同步块。
  2. 阻塞线程:线程在调用 wait() 后会进入阻塞状态,直到被唤醒。
  3. 条件判断wait() 常常与条件判断一起使用,以便线程可以在等待时判断某些条件是否满足。

wait() 的使用示例

public class WaitExample {
    private static final Object lock = new Object();
    
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread1: Waiting...");
                    lock.wait(); // 进入等待状态并释放锁
                    System.out.println("Thread1: Resumed.");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread2: Performing task...");
                lock.notify(); // 唤醒正在等待的线程
                System.out.println("Thread2: Task completed.");
            }
        });

        thread1.start();
        Thread.sleep(1000); // 确保 thread1 先执行并进入等待
        thread2.start();
    }
}

在这个例子中,thread1 调用 wait() 进入等待状态,释放锁。thread2 调用 notify() 唤醒 thread1,然后 thread1 继续执行。

sleep() 方法的工作原理

sleep() 方法是 Thread 类中的一个静态方法,它使当前线程暂停执行指定的时间,而不会释放持有的锁。线程在指定的时间内进入休眠状态,时间到后会自动恢复执行。sleep() 方法通常用于暂停线程的执行,而不涉及线程间的协调或通信。

sleep() 方法的关键特性

  1. 不释放锁:与 wait() 不同,调用 sleep() 后,当前线程不会释放它持有的锁,这意味着其他线程无法获取该锁,直到当前线程恢复执行。
  2. 线程休眠:线程进入睡眠状态,等待指定时间后自动唤醒继续执行。
  3. 常用场景sleep() 通常用于控制线程的执行时间,比如模拟延迟、定时任务等场景。

sleep() 的使用示例

public class SleepExample {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            try {
                System.out.println("Thread: Sleeping...");
                Thread.sleep(2000); // 使线程休眠 2 秒
                System.out.println("Thread: Woke up after sleep.");
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        thread.start();
    }
}

在这个例子中,thread 线程调用 sleep(2000) 使自己暂停 2 秒。线程不会释放锁,它会在 2 秒后恢复执行。

知识拓展

wait() 和 sleep() 的应用场景

  • wait() 的场景:wait() 主要用于 线程间的通信,在多个线程之间协调执行顺序。例如,在生产者-消费者模式中,生产者线程可以在资源不足时调用 wait(),消费者线程可以在有新资源时调用 notify() 唤醒生产者线程。
  • sleep() 的场景:sleep() 主要用于 线程延时控制。如果我们希望线程定期执行某个任务,或者模拟某些操作的延时,可以使用 sleep() 来实现。

生产者-消费者模型

在生产者-消费者模型中,wait() 和 notify() 经常用来实现线程间的同步。例如,生产者线程可以在缓冲区满时调用 wait(),消费者线程在缓冲区为空时也会调用 wait(),而当某个线程完成操作后,另一个线程通过 notify() 唤醒它。

public class ProducerConsumerExample {
    private static final Object lock = new Object();
    private static int buffer = 0;

    public static void main(String[] args) {
        Thread producer = new Thread(() -> {
            synchronized (lock) {
                while (true) {
                    if (buffer == 10) {
                        try {
                            lock.wait();  // 缓冲区满时,生产者等待
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                    } else {
                        buffer++;
                        System.out.println("Produced: " + buffer);
                        lock.notify();  // 唤醒消费者线程
                    }
                }
            }
        });

        Thread consumer = new Thread(() -> {
            synchronized (lock) {
                while (true) {
                    if (buffer == 0) {
                        try {
                            lock.wait();  // 缓冲区空时,消费者等待
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                    } else {
                        buffer--;
                        System.out.println("Consumed: " + buffer);
                        lock.notify();  // 唤醒生产者线程
                    }
                }
            }
        });

        producer.start();
        consumer.start();
    }
}

性能优化和注意事项

  • 使用 sleep() 时要小心:因为 sleep() 不释放锁,长时间的休眠会导致其他线程无法访问同步资源,可能会导致死锁或性能瓶颈。因此,避免在长时间持有锁的情况下调用 sleep()
  • wait() 和 sleep() 的异常处理:wait() 和 sleep() 都会抛出 InterruptedException,因此需要在调用时进行适当的异常处理。InterruptedException 表示线程在等待或休眠期间被中断,因此需要确保线程在中断时做出正确的响应。
  • 避免不必要的阻塞:尽量避免在不需要阻塞的情况下使用 wait() 或 sleep(),过度的阻塞会导致性能下降,尤其是在多线程密集型应用中。

死锁问题

如果一个线程持有锁并调用了 sleep(),而另外一个线程请求该锁并进入 wait(),那么可能会导致死锁问题。例如,线程 A 调用 sleep(),同时线程 B 进入 wait(),但由于 A 持有锁,B 永远得不到锁,从而永远处于等待状态。

public class DeadlockExample {
    private static final Object lock1 = new Object();
    private static final Object lock2 = new Object();

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            synchronized (lock1) {
                try {
                    Thread.sleep(1000);  // 模拟执行时间
                    synchronized (lock2) {
                        System.out.println("Thread1: Acquired both locks.");
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (lock2) {
                try {
                    Thread.sleep(1000);  // 模拟执行时间
                    synchronized (lock1) {
                        System.out.println("Thread2: Acquired both locks.");
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

在这个例子中,thread1 和 thread2 可能导致死锁,因为它们分别持有 lock1 和 lock2,并且等待对方释放锁,从而永远无法继续执行。

总结

wait() 用于线程通信协作,sleep()用来延时等待。开发时严禁在同步代码块里长时间调用 sleep(),不然极易引发死锁问题。合理区分二者适用场景,规范处理中断异常,规避无效阻塞,才能写出安全高效的多线程代码,保障并发程序稳定运行。

以上关于Java中wait()与sleep()方法的不同点是什么?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

16

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Java中wait()与sleep()方法的不同点是什么?