图文详解JUC:Wait与Sleep的区别与细节


目录

一.Wait()

二.Sleep()

三.总结Wait()与Sleep()的区别


一.Wait()

在Java中,wait() 方法是 Object类中的一个方法,用于线程间的协作。当一个线程调用wait() 方法时,它会释放对象的锁并进入等待状态,直到其他线程调用相同对象的 notify()或 notifyAll() 方法唤醒它。当其他线程调用相同对象的 notify() 后会唤醒一个处于等待状态线程,而如果是调用 notifyAll() 的话则会唤醒全部的等待状态的线程。

wait() 方法有几种不同的重载形式:

  1. wait():导致当前线程等待,直到另一个线程调用相同对象的notify()或notifyAll()方法。
  2. wait(long timeout):导致当前线程等待,直到另一个线程调用相同对象的notify()或notifyAll()方法,或者指定的时间(以毫秒为单位)已过。
  3. wait(long timeout, int nanos):导致当前线程等待,直到另一个线程调用相同对象的notify()或notifyAll()方法,或者指定的时间已过(以毫秒和纳秒为单位)。

在使用 wait()方法时,需要注意以下几点:

  1. 必须在同步块或同步方法中调用wait()方法,否则会抛出IllegalMonitorStateException异常。
  2. 调用wait()方法后,当前线程会释放对象的锁,但不会释放对象的所有权。
  3. 当一个线程在等待时被中断,会抛出InterruptedException异常。

在之前的文章中,我们有讲到Synchronized的实现会通过Monitor来监视当前线程,对于Monitor中的WaitSet区域就是用来存放被 wait() 置于等待状态的线程,从而就会释放当前锁。

而处于等待状态的线程收到其他线程调用相同对象的 notify()或 notifyAll() 方法唤醒后,就可以重新回到线程队列中去竞争这个锁。

二.Sleep()

在Java中,sleep() 方法是Thread类的一个静态方法,用于使当前线程暂停执行一段时间。它接受一个以毫秒为单位的参数,表示线程要睡眠的时间长度。调用sleep() 方法会导致当前线程暂时放弃CPU的执行权,但不会释放锁当睡眠时间结束或线程被中断时,线程会重新进入可运行状态。另外 sleep() 方法不会释放对象的锁,因此如果一个线程在同步块或同步方法中调用sleep() 方法,其他线程仍然无法访问该对象的同步块或同步方法。

三.总结Wait()与Sleep()的区别

总的来说,wait() 和sleep() 是Java中用于线程控制的两个不同方法,它们的主要区别在于用途和影响。

  1. 所属类和调用方式:

    • wait()方法属于Object类,因此只能在同步代码块或同步方法中调用,并且必须通过持有对象的锁来调用。
    • sleep()方法是Thread类的静态方法,可以在任何地方直接调用。
  2. 锁的释放:

    • 在调用wait()方法时,线程会释放对象的锁,并进入等待状态,直到被其他线程调用notify()notifyAll()唤醒。
    • 调用sleep()方法时,线程不会释放锁,它只是暂时放弃CPU的执行权,但其他线程依然无法访问该线程持有的锁。
  3. 用途:

    • wait()通常用于线程间的协作,例如一个线程等待另一个线程完成某个操作后再继续执行。
    • sleep()通常用于线程的时间控制,例如实现简单的定时功能或控制线程执行顺序。
  4. 异常处理:

    • wait()方法会抛出InterruptedException异常,因此在调用wait()方法时需要进行异常处理。
    • sleep()方法也会抛出InterruptedException异常,需要进行异常处理。
  5. 调用方式:

    • wait()方法需要在try-catch块中调用,或者将异常抛出给上层调用者处理。
    • sleep()方法也需要在try-catch块中调用,或者将异常抛出给上层调用者处理。

对于二者关于锁的释放的不同可以用下面这个图示来说明,wait方法就相对于让当前线程从工作房间里面出来, 去一个休息室休息,从而把当前房间让给其他线程工作;而sleep方法则相对于是让线程在房间里面原地休息一下,等休息够了后继续干活




 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见 

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

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

相关文章

JVM调优-调优原则和原理分析

1.写在前面 对于JVM调优这个话题,可能大部分程序员都听过这个名词。 但是绝大多数程序员,都没有真真实实去干过,都没有真实的实践过。也不懂得如何调优?不知道要调成怎么样? 那今天咋们就对这个话题来展开描述一下&…

洛谷 P3372:线段树 1 ← 分块算法模板(区间更新、区间查询)

【题目来源】https://www.luogu.com.cn/problem/P3372【题目描述】 如题,已知一个数列,你需要进行下面两种操作: (1)将某区间每一个数加上 k。 (2)求出某区间每一个数的和。【输入格式】 第一行…

二叉树——初解

二叉树 树树的概念树的性质 二叉树二叉树的概念二叉树的性质二叉树的实现方式数组构建左孩子右兄弟法构建指针构建 树 树的概念 在计算机科学中,树(Tree)是一种重要的非线性数据结构,它由若干节点(Node)组…

Chromium 调试指南2024 Windows11篇-调试变量监视(十)

1. 前言 设置断点和监视变量是调试过程中常用的两种技术手段。通过设置断点,我们可以暂停程序的执行并检查程序的内部状态,而监视变量则可以帮助我们实时查看程序中关键变量的值。本文将介绍如何在Chromium项目中进行断点设置和变量监视,帮助…

java内容快速回顾+SSM+SpringBoot简要概述

文章目录 java基础知识基本知识列表面对对象堆与栈的关系值修改与引用修改异常:错误异常 SSMspringMVCServletSpringMVC:基于 Servlet的 Spring Web 框架, spring控制反转 IoC(Inversion of Control)面向切面 Aop MybatisJDBCMybatis SpringB…

Git 基础使用(1) 入门指令

文章目录 Git 作用Git 安装Git 使用Git 仓库配置Git 工作原理Git 修改添加Git 查看日志Git 修改查询Git 版本回退 概念补充 Git 作用 Git 是一种分布式版本控制系统,它旨在追踪文件和文件夹的更改,并协助多人协作开发项目。 Git 安装 (Lin…

17.多线程

多线程 程序、进程、线程的概念 程序:是指令和数据的有序集合,是一个静态的概念。比如,在电脑中,打开某个软件,就是启动程序。 进程:是执行程序的一次执行过程,是一个动态的概念,…

基于SSM的“口腔护理网站”的设计与实现(源码+数据库+文档)

基于SSM的“口腔护理网站”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 首页 用户注册页面 医生信息查看模块 口腔护理预约模块 后台首页面…

分享如何通过定时任务调用lighthouse前端测试脚本+在持续集成测试中调用lighthouse前端测试脚本

最近写了个小工具来优化lighthouse在实际工作中的使用,具体实现了:通过定时任务调用前端测试脚本在持续集成测试中调用前端测试脚本。由于在公司中已经应用,所以就不能提供源码了,这里简单说一下实现思路,希望可以帮助…

Java 循环结构 - for, while 及 do...while

Java 循环结构 - for, while 及 do…while 顺序结构的程序语句只能被执行一次。 如果您想要同样的操作执行多次,就需要使用循环结构。 Java中有三种主要的循环结构: while 循环 do…while 循环 for 循环 在 Java5 中引入了一种主要用于数组的增强型 f…

OUC图书馆电脑开启无线网络,连接手机热点,解决联网但无法访问网络的问题

OUC图书馆电脑连手机热点 前言手动脚本(暂未测试)注意 前言 【中国海洋大学】OUC图书馆电脑默认只能有线连校园网,这让没有校园网的人很是头疼(手机流量太多了,根本用不完,需要大流量卡的可以私信我&#…

在Android设备丢失数据后恢复数据的4个方法

了解 Android 媒体存储 媒体存储是下载、查看、播放和流式传输视频文件、音频文件、图像和其他媒体文件时所需的过程。此服务无法从手机桌面访问,因此您需要按照以下步骤通过安卓手机访问此系统服务。 步骤1:导航到手机设置,然后转到应用程…

初识鸿蒙之ArkTS基础

前言 学习一种应用程序开发,需要从这种程序的开发语言开始,比如说Android开发从入门到放弃,肯定是从Java基础或者是Kotlin语言基础开始学习的,IOS程序开发也肯定是从object-c开始学习的。鸿蒙软件开发也不例外,如果做…

Vue3+TS实现将html或富文本编辑器转为Word并下载

说明:我用的富文本编辑器是wangEditor: wangEditor官网 安装 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --save yarn add wangeditor/editor-for-vuenext # 或者 npm install wangeditor/editor-for-vuenext --save yarn add …

金万维动态域名小助手怎么用?

金万维动态域名小助手是一个域名检测工具,使用此工具可以进行检测域名解析是否正确、清除DNS缓存、修改DNS服务器地址及寻找在线客服(仅支持付费用户)等操作。对不懂网络的用户是一个很好的检测域名的工具,下面我就讲解一下金万维…

Java聚合项目打包运行笔记

聚合项目创建 略 聚合项目打包配置 父工程 pom文件添加 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>…

[初学者来练]用html+css+javascript个人博客作业需求

文章目录 项目概述项目需求页面设计主页文章列表页文章详情页用户交互额外功能&#xff08;可选&#xff09; 技术要求提交要求评分标准文件代码格式提示HTML 页面结构CSS 样式设计JavaScript 交互功能 项目概述 这个项目旨在通过使用HTML、CSS和JavaScript创建一个简单而功能…

【微信小程序开发(从零到一)【婚礼邀请函】制作】——任务分析和效果实现的前期准备(1)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

深入浅出Java中的数据结构:LinkedHashMap详解

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

通过windows远程桌面,远程连接CentOS系统

1.配置阿里云的YUM仓库 1.1 备份当前的YUM仓库配置文件 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2 下载阿里云的CentOS仓库配置文件 对于CentOS 7&#xff1a; sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirr…