线程控制方法之wait和sleep的区别

news/2024/11/25 19:47:57/

线程控制方法之wait和sleep的区别

wait()和sleep()都是Java线程控制方法,但存在明显区别:

  1. 所属与调用:wait()属Object类,需synchronized调用;sleep()属Thread类,可随意调用。
  2. 锁处理:wait()释放锁,进入等待状态;sleep()不释放锁,仅暂停执行。
  3. 唤醒机制:wait()需notify()或notifyAll()唤醒;sleep()自动苏醒。
  4. 用途:wait()多用于线程间通信;sleep()用于暂停执行。
  5. 异常:两者都可能抛出InterruptedException。

总结:wait()释放锁并等待唤醒,用于线程通信;sleep()不释放锁且自动苏醒,用于暂停执行。

public class ThreadDemo25 {public static void main(String[] args) {Object locker=new Object();Thread t1=new Thread(()->{synchronized (locker){System.out.println("wait之前");try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("wait之后");}});Thread t2=new Thread(()->{try {Thread.sleep(5000);synchronized (locker){System.out.println("notify之前");locker.notify();System.out.println("notify之后");}} catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();}
}

在这里插入图片描述

t2的notify()唤醒t1之后,只有等t2执行完自己的,释放锁之后,t1才能继续。所以先打印notify之后,再打印wait之后

t2 sleep结束之后,由于t1是wait状态,锁是释放的,t2就能拿到锁。

接下来打印t2 notify之前,执行notify操作,这个操作就能唤醒t1(此时t1就从WAITING状态恢复回来了)

但是由于t2此时还没有释放锁呢,t1 WAITING恢复之后,尝试获取锁,就可能会出现一个小小的阻塞,这个阻塞是由于锁竞争引起的。(肉眼很难看到BLOCKED状态,这个状态的变换是非常快的)

t2执行完t2 notify之后,释放锁,t2执行完毕,t1的wait就可以获取到锁了,继续执行打印t1 wait之后。


http://www.ppmy.cn/news/1549896.html

相关文章

【Excel】拆分多个sheet,为单一表格

Private Sub 分拆工作表() Application.ScreenUpdating True 让屏幕显示操作过程, Dim sht As Worksheet Dim MyBook As Workbook Set MyBook ActiveWorkbook For Each sht In MyBook.Sheets If sht.Visible True Then 隐藏的sheet跳过,否则会报1004无…

网络安全核心目标CIA

网络安全的核心目标是为关键资产提供机密性(Confidentiality)、可用性(Availablity)、完整性(Integrity)。作为安全基础架构中的主要的安全目标和宗旨,机密性、可用性、完整性频频出现,被简称为CIA,也被成为你AIC,只是顺序不同而已…

贪心算法(2)

目录 K次取反后最大化的数组和 题解: 代码: 按身高排序(田忌赛马的预备) 题解: 代码: 方法一: 方法二: 优势洗牌(田忌赛马) 题解: 代…

Python毕业设计选题:基于django+vue的企业it资产管理系统

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 员工管理 设备信息管理 设备借用管理 软件信息管理 软件…

基于python的机器学习(四)—— 聚类(一)

目录 一、聚类的原理与实现 1.1 聚类的概念和类型 1.2 如何度量距离 1.2.1 数据的类型 1.2.2 连续型数据的距离度量方法 1.2.3 离散型数据的距离度量方法 1.3 聚类的基本步骤 二、层次聚类算法 2.1 算法原理和实例 2.2 算法的Sklearn实现 2.2.1 层次聚类法的可视化实…

重绘重排、CSS树DOM树渲染树、动画加速 ✅

浏览器下载完页面中的所有组件,HTML标记、JavaScript、CSS、图片后,之后会解析并生成两个内部数据结构:DOM树和渲染树。DOM树表示页面结构,渲染树表示DOM节点如何显示。 ——《高性能JavaScript》 DOM树中的每一个需要显示的节点在…

OAI-5G开源通信平台实践(五)

参考资料及进阶学习 open5GS 以下为基于oai 5GC + oai gnb + nrue rfsim 在docker中的搭建流程 ci-scripts/yaml_files/5g_rfsimulator develop oai / openairinterface5G GitLab (eurecom.fr) 多UE运行 https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy L2 sim…

【SQL】【数据库】语句翻译例题

SQL自然语言到SQL翻译知识点 以下是将自然语言转化为SQL语句的所有相关知识点,分门别类详细列出,并结合技巧说明。 1. 数据库操作 创建数据库 自然语言:创建一个名为“TestDB”的数据库。 CREATE DATABASE TestDB;技巧:识别**“创…