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

ops/2024/9/20 7:25:10/ 标签: java, 开发语言, jvm, 经验分享


目录

一.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.ppmy.cn/ops/41474.html

相关文章

GPT-4o API 全新版本发布:提升性能,增加性价比

5月13日,OpenAI 发布了全新ChatGPT模型 GPT-4o,它在响应速度和多媒体理解上都有显著提升。在这篇文章中,我们将介绍 GPT-4o 的主要特点及其 API 集成方式。 什么是 GPT-4o? GPT-4o 是 OpenAI 于5月13日发布的最新多模态 AI 模型…

软件3班20240513

java.util.PropertyResourceBundle4554617c package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) throws SQLException { // 获取属性配置文件ResourceBundle bundle Res…

SpringMVC 注解详解

SpringMVC 注解详解 1. 引言 SpringMVC 是 Spring 框架中的 Web 层解决方案,它通过注解的方式来简化 MVC 模式的实现。本篇将详细介绍 SpringMVC 中常用的注解及其用法。 2. SpringMVC 注解分类 SpringMVC 的注解主要分为以下几类: 2.1 核心注解 C…

qt 麒麟系统 connot find /usr/local/lib

目录 解决方法: 后来又报错: cannot find -lopencv_world3.4.6 connot find /usr/local/lib 解决方法: LIBS -L/usr/local/lib -lopencv_world3.4.6QMAKE_LFLAGS -Wl,-rpath,/usr/local/lib 后来又报错: cannot find -lopencv…

软件测试面试78问

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、问:你在测试中发现了一个bug,但是开发经理认为这不是一个bug&#xf…

Pycharm所有快捷键的使用

1.编辑 快捷键作用Ctrl Space基本的代码完成(类、方法、属性)Ctrl Alt Space快速导入任意类Ctrl Shift Enter语句完成Ctrl P参数信息(在方法中调用参数)Ctrl Q快速查看文档Shift F1外部文档Ctrl 鼠标简介Ctrl F1显示错…

从零开始详解OpenCV条形码区域分割

前言 在识别二维码之前,首先要划分出二维码的区域,在本篇文章中将从零开始实现二维码分割的功能,并详细介绍用到的方法。 我们需要处理的图像如下: 完整代码 首先我们先放出完整代码,然后根据整个分割流程介绍用到…

[自动化]pyautogui的使用

目录 环境 包的版本 前置知识 鼠标控制函数 屏幕与鼠标位置 size() position() OnScreen() 鼠标移动 moveTo() move() 鼠标拖动 dragTo() drag() mouseDown()按下鼠标 mouseUp()松开鼠标 鼠标滚动 scroll() 键盘控制函数 write() press() keyDown()和keyU…

wireshark_概念

ARP (Address Resolution Protocol)协议,即地址解析协议。该协议的功能就是将IP地址解析成MAC地址。 混杂模式 抓取经过网卡的所有数据包,包括发往本网卡和非发往本网卡的。 非混杂模式 只抓取目标地址是本网卡的数据包,对于发往…

前端 JS 经典:CommonJs 规范

1. Node 环境介绍 CommonJs 简称 CMJ,CMJ 的模块标准,必须在 node 的环境中才支持。在浏览器中用,是不行的。 查看电脑是否安装 node,通过打开终端,运行 node -v 查看是否返回 node 版本。返回则已安装。 CMJ 在 no…

数据结构之----树

树 结点拥有的子树数量称为结点的度 树中结点的最大层次称为树的深度或高度 如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称无序树 森林是m棵互不相交的树的集合 树的存储结构 1,双亲表示法…

【JVM】调优工具

这里简单介绍一下各种调优用到的工具 一,环境准备 首先我们需要准备好Java环境,和win上的jdk环境(图形化界面如jconsole只有jdk中有)。 有这样一个类Prolem,每个线程都会带来100个垃圾对象,线程new完100…

用Rust打印杨辉三角

一、杨辉三角是什么? 杨辉三角是一个著名的数学图形,它展示了二项式系数的排列方式。 杨辉三角是一种将二项式系数以三角形阵列排列的数学图形,具有丰富的历史和数学意义。 杨辉三角的历史起源可以追溯到中国南宋时期,由数学家杨辉…

leetcode刷题——设计循环链表

题目要求我们设计循环队列,其特点是容量固定,队列循环,如图所示: 这里的队列我们以链表队列举例,对于循环,只需要把尾节点的指针指向头节点。重点是队列的容量固定:如何确定队列是否已满和空&am…

Kaggle赛题总结:Enefit - Predict Energy Behavior of Prosumers

文章目录 比赛介绍赛题任务评估指标数据集描述优胜方案第1名第6名第7名第10名第13名内容分享冠军tricktrick应用获胜方案里对trick的应用模型特征工程在线学习小结

AI视频教程下载:用ChatGPT制作 YouTube视频的指南

课程大纲: 面向 YouTuber 的 ChatGPT YouTube关键词研究 YouTube标题 YouTube缩略图 YouTube社区帖子 组织您的 YouTube 视频 本课程将通过两个不同领域的YouTube视频,展示如何使用Chat GPT来创建关键词、标题、缩略图、描述和社区帖子。 关键词研…

C++中调用python函数(VS2017+WIN10+Anaconda虚拟环境)

1.利用VS创建C空项目 step1 文件——新建——项目 step2 Visual C—— Windows桌面——Windows桌面向导 step3 选择空项目 step4 源文件——新建项——添加 step5 Visual C——C文件(.cpp) 2.配置环境 Step1. 更换成Release与X64 Step2. 打开项目属性&…

react18封装公共请求函数

如果里面要处理比如token过期,跳转登录这种情况的话,官方又说组件外不允许使用Hooks函数,这里可以这样做 使用redux 并新建一个store/index.ts import { configureStore, combineReducers } from reduxjs/toolkit import counterRouter fro…

Spring Boot进阶 - Starter原理

Spring Boot Starter的原理主要是为了简化Spring应用的配置和初始化过程,让开发者能够快速启动并运行应用,而不需要手动配置大量的XML或Java配置类。下面是Spring Boot Starter的核心工作原理: 自动配置(Auto-Configuration&#…

Facebook国内企业三不限白名单户/二不限/BM户

哈喽呀,今天是来给大家分享一下Facebook国内三不限白名单户/二不限/BM户都是啥? Facebook作为全球最大的社交媒体,同时也是各大跨境电商企业选择作为推广广告的平台,Facebook为了满足各大企业的需求,提供…