深入浅出:Java面试必看!sleep与wait方法的区别详解

文章目录

  • 深入浅出:Java面试必看!sleep与wait方法的区别详解
    • 什么是线程?
    • 为什么需要暂停线程?
    • sleep()方法详解
      • sleep()的基本概念
      • sleep()的使用场景
        • 示例代码:使用sleep()实现简单的定时任务
      • sleep()的注意事项
    • wait()方法详解
      • wait()的基本概念
      • wait()的使用场景
        • 示例代码:使用wait()实现生产者消费者模型
      • wait()的注意事项
    • sleep()和wait()的区别
      • 1. 所属类不同
      • 2. 使用方式不同
      • 3. 锁的情况不同
      • 4. 唤醒方式不同
      • 5. 使用场景不同
        • 示例代码:比较sleep()和wait()
    • 总结
    • 希望这篇文章能帮助大家更好地理解`sleep()`和`wait()`的区别和用法。
      • 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

深入浅出:Java面试必看!sleep与wait方法的区别详解

大家好,欢迎来到闫工的“深入浅出”系列,今天我们要聊的是Java中两个非常容易被搞混的方法——sleep()wait()。这两个方法虽然看起来都是让线程暂停执行,但它们之间有着本质的区别。作为一个Java开发者,尤其是准备面试的时候,必须清楚地理解这两者的区别,否则很容易在面试中丢分哦!

什么是线程?

在深入讲解sleep()wait()之前,我先简单回顾一下线程的基本概念。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的一个执行单元。简单来说,线程就是一段可以独立运行的代码。

在Java中,我们可以通过继承Thread类或者实现Runnable接口来创建线程。不过,这里我不会深入讲解线程的创建方式,因为我们的重点是sleep()wait()的区别。

为什么需要暂停线程?

在线程编程中,很多时候我们需要让某个线程暂停执行一段时间。比如:

  • 在某些定时任务中,我们需要每隔一定时间执行一次操作。
  • 在某些情况下,我们可能需要等待其他线程完成某个任务后才能继续执行当前线程的操作。

这个时候,sleep()wait()这两个方法就会派上用场了。不过,它们的使用场景和实现机制是完全不同的。

sleep()方法详解

sleep()的基本概念

sleep()方法属于Thread类,它是用来让当前线程暂停执行一段时间的方法。它的语法如下:

publicstaticvoidsleep(longmillis)throwsInterruptedException

或者

publicstaticvoidsleep(longmillis,intnanos)throwsInterruptedException

其中,millis表示要暂停的毫秒数,nanos表示额外的纳秒数。需要注意的是,sleep()方法是一个静态方法,这意味着它必须通过类名来调用,而不能在实例上调用。

sleep()的使用场景

sleep()通常用于需要让当前线程暂停执行一段时间的情况。比如:

  • 在控制台打印信息时,为了让输出更清晰,可以使用sleep()来控制每条信息的显示时间。
  • 在一些定时任务中,使用sleep()可以让线程每隔一定时间执行一次操作。
示例代码:使用sleep()实现简单的定时任务
publicclassSleepExample{publicstaticvoidmain(String[]args){newThread(()->{try{while(true){System.out.println("当前时间:"+System.currentTimeMillis());Thread.sleep(1000);// 暂停1秒}}catch(InterruptedExceptione){System.out.println("线程被中断了!");}}).start();}}

运行这段代码,你会发现每隔一秒钟控制台会打印一次当前时间。这就是sleep()的一个典型应用。

sleep()的注意事项

  • sleep()是一个静态方法,必须通过Thread类调用。
  • 如果线程在睡眠过程中被中断(比如调用了interrupt()方法),则会抛出InterruptedException异常。
  • 在使用sleep()时,一定要注意处理可能的InterruptedException异常,否则编译器会报错。

wait()方法详解

wait()的基本概念

wait()方法属于Object类,它是用来让当前线程等待某个特定条件满足的方法。它的语法如下:

publicfinalvoidwait()throwsInterruptedException

或者

publicfinalvoidwait(longtimeout)throwsInterruptedException

sleep()不同,wait()不是静态方法,它需要在对象上调用,并且必须配合synchronized关键字使用。

wait()的使用场景

wait()通常用于线程间通信的场景。比如:

  • 在生产者消费者模型中,当队列为空时,消费者线程会调用wait()等待生产者线程生产数据。
  • 当某个资源不可用时,可以通过wait()让线程暂停执行,直到资源可用。
示例代码:使用wait()实现生产者消费者模型
publicclassWaitExample{publicstaticvoidmain(String[]args){Objectlock=newObject();newThread(()->{synchronized(lock){System.out.println("生产者开始生产...");try{lock.wait();// 等待消费者唤醒}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("生产者被唤醒,继续生产...");}}).start();newThread(()->{synchronized(lock){System.out.println("消费者开始消费...");lock.notify();// 唤醒生产者try{Thread.sleep(2000);// 消费者暂停2秒}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("消费者完成消费...");}}).start();}}

运行这段代码,你会看到:

  1. 生产者开始生产…
  2. 消费者开始消费…
  3. 生产者被唤醒,继续生产…
  4. 消费者完成消费…

这就是wait()的一个典型应用。生产者在队列为空时调用wait()等待消费者唤醒。

wait()的注意事项

  • wait()必须在synchronized块中使用,否则会抛出IllegalMonitorStateException异常。
  • 如果线程在等待过程中被中断,则会抛出InterruptedException异常。
  • 在释放锁之前,必须确保其他线程有机会获取到锁。通常的做法是,在调用wait()之后,不要立即退出synchronized块,而是让其他线程有时间处理。

sleep()和wait()的区别

经过上面的讲解,相信大家对sleep()wait()有了初步的了解。现在,我们来总结一下它们之间的区别:

1. 所属类不同

  • sleep()属于Thread类。
  • wait()属于Object类。

2. 使用方式不同

  • sleep()是静态方法,必须通过Thread类调用。
  • wait()是非静态方法,必须在对象上调用,并且必须配合synchronized关键字使用。

3. 锁的情况不同

  • sleep()不会释放锁。线程暂停执行时,仍然持有锁,其他需要获取该锁的线程会被阻塞。
  • wait()会释放锁。线程暂停执行时,会将锁释放,允许其他线程获取该锁。

4. 唤醒方式不同

  • sleep()会在指定的时间结束后自动恢复执行,或者被中断。
  • wait()需要通过notify()notifyAll()方法来唤醒。

5. 使用场景不同

  • sleep()适用于需要让当前线程暂停一段时间的情况。
  • wait()适用于需要等待某个特定条件满足的情况,并且通常用于线程间通信。
示例代码:比较sleep()和wait()
publicclassCompareSleepAndWait{publicstaticvoidmain(String[]args){Objectlock=newObject();// 使用sleep()newThread(()->{try{System.out.println("使用sleep(): 线程开始暂停1秒...");Thread.sleep(1000);System.out.println("使用sleep(): 线程恢复执行...");}catch(InterruptedExceptione){e.printStackTrace();}}).start();// 使用wait()newThread(()->{synchronized(lock){try{System.out.println("使用wait(): 线程开始等待...");lock.wait();System.out.println("使用wait(): 线程被唤醒...");}catch(InterruptedExceptione){e.printStackTrace();}}}).start();// 唤醒wait()线程newThread(()->{synchronized(lock){try{Thread.sleep(2000);// 等待2秒,确保wait()线程已经进入等待状态System.out.println("唤醒wait()线程...");lock.notify();}catch(InterruptedExceptione){e.printStackTrace();}}}).start();}}

运行这段代码,你会看到:

  1. 使用sleep(): 线程开始暂停1秒…
  2. 使用wait(): 线程开始等待…
  3. 唤醒wait()线程…
  4. 使用wait(): 线程被唤醒…
  5. 使用sleep(): 线程恢复执行…

从这个例子可以看出,sleep()wait()在使用方式和效果上有很大的不同。

总结

  • sleep()用于让当前线程暂停一段时间,通常用于需要延迟执行的场景。
  • wait()用于等待某个特定条件满足,通常用于线程间通信和协作。
  • sleep()不会释放锁,而wait()会释放锁。
  • 在使用wait()时,必须在synchronized块中,并且通过notify()notifyAll()来唤醒。

希望这篇文章能帮助大家更好地理解sleep()wait()的区别和用法。

📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

成体系的面试题,无论你是大佬还是小白,都需要一套JAVA体系的面试题,我已经上岸了!你也想上岸吗?

闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了1000+ 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 + 详细解析,并附赠高频考点总结、简历模板、面经合集等实用资料!

✅ 覆盖大厂高频题型
✅ 按知识点分类,查漏补缺超方便
✅ 持续更新,助你拿下心仪 Offer!

📥免费领取👉 点击这里获取资料

已帮助数千位开发者成功上岸,下一个就是你!✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1124815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot+vue的图书馆座位预约与智能管理系统的设计与实现_2v403ii1

目录摘要开发技术核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 该系统基于SpringBoot和Vue框架设计&…

儿童骑行用品新国标 2026 年实施 这些安全要点家长必看

近日,国家市场监督管理总局、国家标准化管理委员会正式发布《儿童骑行及活动用品 通用安全要求》(GB46517-2025)📢,该标准将于 2025 年 10 月 5 日发布、2026 年 11 月 1 日正式实施。这一标准的出台,填补了…

亲测好用10个一键生成论文工具,本科生轻松搞定毕业论文!

亲测好用10个一键生成论文工具,本科生轻松搞定毕业论文! AI 工具如何改变论文写作的未来 在当今学术写作中,越来越多的本科生开始借助 AI 工具来提升效率。尤其是在论文写作过程中,AI 不仅能够帮助学生快速生成初稿,还…

英文文献在哪里找:高效查找英文文献的方法与途径

一、WisPaper:智能学术搜索激发科研灵感 科研创新的关键是了解前沿,找到突破口。但传统查文献方式往往效率低: Google Scholar 或 arXiv 搜索结果太多,难以筛选公众号推送滞后,容易错过最新研究文献阅读时间长&#…

springboot+vue的学生宿舍管理系统的设计与实现 可视化2c0svsyf

目录摘要开发技术核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 基于SpringBoot和Vue的学生宿舍管理系统…

2026必备8个降AI率工具测评,本科生去AI痕迹指南

2026必备8个降AI率工具测评,本科生去AI痕迹指南 2026年降AI率工具测评:为何需要专业工具? 随着人工智能技术的快速发展,AIGC(人工智能生成内容)检测系统在学术领域的应用日益广泛。许多本科生在撰写论文、报…

英文文献检索:高效策略与技巧指南

一、WisPaper:智能学术搜索激发科研灵感 科研创新的关键是了解前沿,找到突破口。但传统查文献方式往往效率低: Google Scholar 或 arXiv 搜索结果太多,难以筛选公众号推送滞后,容易错过最新研究文献阅读时间长&#…

【STM32】SysTick操作系统延时函数的讲解,手撸带操作系统的延时函数

1. 流水灯模拟多线程 用一个流水灯小实验学习systick,模拟多线程1.1 main.c 先看main.c文件,main函数中实现两个灯进行不同的任务 #include "sys.h" #include "delay.h" #include "led.h" #include "tasks.h"in…

强烈安利8个AI论文网站,专科生毕业论文轻松搞定!

强烈安利8个AI论文网站,专科生毕业论文轻松搞定! 专科生论文写作的救星,AI工具如何帮你轻松应对 对于许多专科生来说,毕业论文不仅是学业生涯中的一次重要考验,也是一场与时间、知识和压力的较量。而如今,随…

iOS App的tcp、udp数据包抓取在实际开发中的使用方式

我开始用数据流抓包的方式看 iOS 网络行为,是在一次很典型的场景里。 接口返回完全正常,日志也没有异常,但功能在真机上偶发失效。 代理抓包工具里,HTTPS 请求干净得不像是有问题的样子。先明确一件事:iOS 数据流抓包在…

医院智能随访管理系统,java版随访系统源码,符合三甲医院评审标准,能对接HIS等医疗系统

医院智能随访管理系统包括患者档案管理、随访呵护、随访登记、健康教育等功能,支持主动随访模式和被动随访模式,为随访工作人员提供管理信息和标准化随访依据,能够很好地辅助医院各科室的日常随访工作、规范随访的信息处理流程,提…

STM32F103步进电机S曲线加减速定位算法详解

stm32f103步进S曲线加减速定位算法在嵌入式开发中,步进电机的控制是一个常见的需求,尤其是在需要精确定位的场合。今天我们来聊聊如何在STM32F103上实现步进电机的S曲线加减速定位算法。这个算法不仅能让我们更平滑地控制电机,还能减少机械冲…

机器学习中的层次聚类(凝聚型)

摘要:层次聚类(凝聚型)是一种自底向上的无监督聚类算法,通过逐步合并最近邻簇构建层次结构。该算法首先将每个样本视为独立簇,然后基于距离度量(如Ward法、单链接法等)迭代合并簇,最…

34.方块定位

1.使用WhiteRec.CBD图片完成以下操作 ①测量每个图片上有多少个物料(白色方块),并显示在图片上 ②在图像上按从左到右,从上到下的顺序标记每颗物料的序号,序号显示在物料的中心附近 ③将料盘按照下图的样式划分,每个区域内一颗物料,并显示分割线。 ④在图像上找出每颗…

Cloudflare Workers 和 Pages 的本质区别:托管 vs 计算

Cloudflare Workers 和 Pages 经常一起被提,但它们解决的是两类完全不同的问题。可以一句话先分清: Pages 是“托管与发布”,Workers 是“计算与控制”。 下面我按定位 → 能力 → 典型场景 → 选型建议把差异说透。 一、核心定位差异(最重要) Cloudflare Pages 定位:前…

Qoder NEXT 来了:补全功能全新升级,AI 代码采纳率提升 65%

今天,Qoder 智能补全能力全面升级,并发布全新品牌 NEXT。Qoder NEXT 能主动感知整个代码库与编辑历史,在开发者完成一次修改后,立即推断出后续需要联动变更的位置,并提供精准的代码建议,让 AI 真正理解&quo…

黑客技术门槛有多高?普通人入局需谨慎!网安入行必看的 3 个事实

经常能看到有人问 “零基础能学黑客技术吗?”“学网安真的能月入 20K 吗?”—— 作为从业多年的安全工程师,今天想从技术门槛、行业收益、职业路径三个维度,跟大家聊聊真实的网安行业,帮想入行的朋友避开 “脚本小子”…

双馈风力发电系统AC/DC/AC变流器的仿真模型 ,网侧变流器及转子侧变流器的控制方案,采用双...

双馈风力发电系统AC/DC/AC变流器的仿真模型 ,网侧变流器及转子侧变流器的控制方案,采用双PWM控制,网侧采用定子电压定向,转子侧采用定子磁链定向,实现超同步及次同步时功率的双向流动。 还有20页的说明内容。双馈风机变…

用 Cloudflare D1 给 Pages/Functions 上数据库:一套“绑定式部署”的正确姿势

你现在的站点不是静态导出,而是 Next.js App Router 跑在 Cloudflare Pages 的 SSR/Functions 上。 这意味着:你的 API(例如 /api/footprints 留言)本质是 Cloudflare Worker 运行时,它拿数据库不是走“公网连接串”,而是走 Cloudflare 的 Binding 注入: 你在 Cloudflar…

京东蚂蚁领跑链上金融:香港RWA革命如何打通万亿级资产新通道?

引言:一场静默的金融革命正在东方之珠上演当华尔街的投行精英还在为传统证券代币化的合规框架争论不休时,香港维多利亚港的夜色中,一场以“现实资产代币化”(RWA)为核心的链上金融竞赛已悄然进入白热化阶段。京东科技在…