wait()、sleep()、notify()的解析

news2024/12/25 13:32:10

wait()、sleep()、notify()的解析

  • 【🎈问题1】:wait()、sleep()、notify()有什么作用?
  • 【🎈问题2】:wait()、sleep()的区别?
  • 【🎈问题3】:为什么 wait() 方法不定义在 Thread 中,sleep()却定义在线程中?

代码示例:创建三个线程

public class WaitAndNotifyTest {
    public static final WaitAndNotifyTest MONITOR = new WaitAndNotifyTest();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (MONITOR) {
                System.out.println("线程1开始了.....");
                try {
                    System.out.println("线程1wait()了.....");
                    MONITOR.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("线程1结束了.....");
            }
        }).start();

        new Thread(() -> {
            synchronized (MONITOR) {
                System.out.println("线程1wait(),线程2抢到锁,线程2开始了.....");
                try {
                    System.out.println("线程2 sleep()5秒钟.....");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("线程2唤醒notify().....");
                MONITOR.notify();
                System.out.println("线程2结束了.....");
            }
        }).start();
        new Thread(() -> {
            synchronized (MONITOR) {
                System.out.println("线程3抢到锁,线程3开始了.....");
                System.out.println("线程3结束了.....");
            }
        }).start();
    }
}

在这里插入图片描述

【注意事项】:必须持有该锁,才能操作锁。

通过上述代码得到以下结论:

  1. 上述线程1内调用了wait()方法后,线程2就抢到锁了。➡️wait()会释放cpu资源,释放锁;
  2. 上述线程2内调用了sleep(5000)方法后,线程3并没有抢到锁。➡️ sleep()会释放cpu资源,不会释放锁;
  3. 上述线程2内调用了notify()方法后,线程1执行了 ➡️ notify()会随机唤醒一个线程;notifyAll()会唤醒所有线程。
  4. sleep()Thread 类的静态本地方法,wait() 则是 Object 类的本地方法。

上述题目答案:

【问题1】:🔔wait()、sleep()、notify()有什么作用?

  • wait():让线程等待,使其暂停执行
  • sleep():让线程休眠,使其暂停执行
  • notify():唤醒正在等待的线程

【问题2】:🔔wait()、sleep()的区别?

  • wait():
    1. 会释放cpu资源、锁资源
    2. 线程不会自动苏醒,需要别的线程调用同一个对象上的 notify()或者 notifyAll() 方法,或者也可以使用 wait(long timeout) 超时后线程会自动苏醒
  • sleep():
    1. 会释放cpu资源
    2. 时间到了后线程会自动苏醒

【问题3】:🔔为什么 wait() 方法不定义在 Thread 中,sleep()却定义在线程中?

​ wait() 方法的作用是让当前线程等待另一个线程发出的通知,并且必须在对象锁上下文中调用,所以它被定义在 Object 类中。

​ sleep() 方法是使当前线程暂停执行的方法,它不需要在锁上下文中调用,因此被定义在 Thread 类中。

【拓展】:🥤yield()方法:

yield() 方法是一个静态方法,调用它可以让当前线程让出 CPU,让 CPU 去执行其他线程。调用 yield() 方法并不会释放当前线程持有的锁。

yield() 方法的作用是让处于运行状态的线程转换到可运行状态,以便让其他线程也有机会运行,从而避免某些线程长时间占用 CPU 而导致其他线程无法执行的问题。但是,yield() 方法不能保证当前线程一定会让出 CPU,因为让出 CPU 的决定是由操作系统来决定的。

示例代码:

javaCopy codepublic class YieldExample implements Runnable {
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
            Thread.yield();
        }
    }

    public static void main(String[] args) {
        YieldExample ye = new YieldExample();
        Thread t1 = new Thread(ye, "Thread-1");
        Thread t2 = new Thread(ye, "Thread-2");
        t1.start();
        t2.start();
    }
}

运行结果可能如下:

makefileCopy codeThread-1: 1
Thread-2: 1
Thread-1: 2
Thread-2: 2
Thread-1: 3
Thread-2: 3
Thread-1: 4
Thread-2: 4
Thread-1: 5
Thread-2: 5

可以看到,两个线程轮流打印输出,因为每个线程在打印完一次后都调用了 yield() 方法

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

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

相关文章

九龙证券|今年最贵新股来了,本周还有超低价新股可申购

本周&#xff08;4月17日—4月21日&#xff09;&#xff0c;截至现在&#xff0c;共有3只新股将进行申购&#xff0c;别离为科创板的晶合集成、创业板的三博脑科、北交所的华原股份。其间华原股份将于周一申购&#xff0c;发行价为3.93元/股&#xff0c;晶合集成将于周四申购&a…

全国青少年软件编程(Scratch)等级考试一级考试真题2023年3月——持续更新.....

一、单选题(共25题&#xff0c;共50分) 1. 下列说法不正确的是&#xff1f;&#xff08; &#xff09; A.可以从声音库中随机导入声音 B.可以录制自己的声音上传 C.可以修改声音的大小 D.不能修改声音的速度 试题解析&#xff1a;针对声音可以进行导入&#xff0c;上传&…

Android 不同分辨率下的Drawable尺寸资源设置

启动器图标 36x36 (0.75x) 用于低密度48x48&#xff08;1.0x 基线&#xff09;用于中密度72x72 (1.5x) 用于高密度96x96 (2.0x) 用于超高密度144x144 (3.0x) 用于超超高密度192x192 (4.0x) 用于超超超高密度&#xff08;仅限启动器图标&#xff1b;请参阅上面的 注&#xff09…

redis 主从模式、哨兵模式、cluster模式的区别

参考&#xff1a; ​https://blog.csdn.net/qq_41071876/category_11284995.html https://blog.csdn.net/weixin_45821811/article/details/119421774 https://blog.csdn.net/weixin_43001336/article/details/122816402 Redis有三种模式&#xff0c;分别是&#xff1a;主…

【C++】STL——用一个哈希表封装出unordered_map和unordered_set

用一个哈希表(桶)封装出unordered_map和unordered_set 文章目录用一个哈希表(桶)封装出unordered_map和unordered_set一、哈希表源码二、哈希函数模板参数的控制三、对上层容器构建仿函数便于后续映射四、string类型无法取模问题五、哈希表默认成员函数实现1.构造函数2.拷贝构造…

【JavaEE】ConcurrentHashMap与Hashtable有什么区别?

博主简介&#xff1a;努力的打工人一枚博主主页&#xff1a;xyk:所属专栏: JavaEE初阶Hashtable、ConcurrentHashMap是使用频率较高的数据结构&#xff0c;它们都是以key-value的形式来存储数据&#xff0c;且都实现了Map接口&#xff0c;日常开发中很多人对其二者之间的区别并…

Jmeter实验

Jmeter实验 启动Jmeter 点击bin目录下的&#xff0c;jmeter进行启动 修改界面语言为中文 发起一个最基本的请求 线程组&#xff0c;Http请求&#xff0c;察看结果树 察看结果树的作用范围 设置请求跟随重定向 响应断言-响应文本 判断响应文本中是否有"百度一…

Scala大数据开发

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Scala简述 在此&#xff0c;简要介绍 Scala 的基本信息和情况。 Scala释义 Scala 源自于英语单词scalable&#xff0c;表示可伸缩的、可扩展的含义。 Scala作者 Scala编…

UDS介绍

首先要有网络网络七层的概念&#xff1a; 学习链接&#xff1a; 七层网络模型-CSDN博客 UDS网络层/TP层&#xff08;ISO 15765-2&#xff09;的解读 - 知乎 (zhihu.com) 概念&#xff1a; UDS&#xff08;Unified Diagnostic Services&#xff0c;统一的诊断服务。 标准名是《…

【栈和队列高频考点题】

目录 1 与栈有关的考题 1.1 最小栈 1.2 栈的弹出压入序列 1.3 逆波兰表达式求值 1.4 二叉树的最近公共祖先 1.5 单调栈 2 与队列有关的考题 2.1 二叉树的分层遍历 2.2 滑动窗口 1 与栈有关的考题 1.1 最小栈 题目描述&#xff1a; 解题思路&#xff1a; 要想在O(1…

微信小程序引入 vant ui组件

1.初始化 在小程序根目录&#xff08;app.js所在目录&#xff09;&#xff0c;打开cmd命令窗口 npm init -y参数 -y 表示对 npm 要求提供的信息&#xff0c;都自动按下回车键&#xff0c;表示接受默认值。 2.下载miniprogram依赖 通过 npm 安装: npm i vant/weapp -S --p…

京东开源RaftKeeper性能超越ZooKeeper!

一、背景介绍 成百上千台服务器组成的分布式系统中&#xff0c;服务器故障或网络抖动会随时发生&#xff0c;有时会导致严重的系统崩溃&#xff0c;为解决如上问题&#xff0c;雅虎开源了ZooKeeper分布式协调服务并在2010年成为Apache顶级项目&#xff0c;是Hadoop、HBase和Cl…

为什么FTP会随着时间的过去而变慢?

有人问&#xff1a;我在XP上有FZ客户端3.5.3&#xff0c;在Vista上有0.9.41服务器。通过已经很慢的连接传输大文件时&#xff0c;我注意到速度开始时约为40kb / s&#xff0c;但逐渐趋于稳定&#xff0c;约为20kb / s&#xff0c;并保持这种状态。如果我退出客户端并重新启动它…

夜天之书 #81 大厂开源之殇

本轮开源之风吹起迄今数年&#xff0c;最大的影响还是越来越多的商业公司开始探索开源方法能够如何改变自己的经营策略。开源策略循序渐进分成使用、参与和发起。在发起开源项目实践一线的&#xff0c;一个是打着开源旗号的创业公司&#xff0c;另一个就是大型企业尤其互联网企…

JUC并发编程之AQS原理

1. AQS 原理 1.1 概述 全称是 AbstractQueuedSynchronizer&#xff0c;是阻塞式锁和相关的同步器工具的框架 特点&#xff1a; 用 state 属性来表示资源的状态&#xff08;分独占模式和共享模式&#xff09;&#xff0c;子类需要定义如何维护这个生态&#xff0c;控制如何获…

剪枝与重参第六课:基于VGG的模型剪枝实战

目录基于VGG的模型剪枝实战前言1.Intro2.Prune实战2.1 说明2.2 test()2.3 加载稀疏训练模型2.4 前处理2.5 建立新模型并存储信息2.6 BatchNorm层的剪枝2.7 Conv2d的剪枝2.8 Linear的剪枝3.基于VGG的模型剪枝总结基于VGG的模型剪枝实战 前言 手写AI推出的全新模型剪枝与重参课程…

快排的递归实现

快速排序是一种时间复杂度低&#xff0c;但会虽随着数组的顺序变化&#xff0c;因为其效率之高被称为快速排序&#xff0c;而 且其不稳定性也可以同过优化进行解决。 快速排序的实现有三种方法&#xff1a; 1.hoare版 其基本思想为&#xff1a;任取待排序元素序列中 的某元…

3、如何使用GDB来进行命令行debug

文章目录一、与前面的联系二、GDB的一些认识1、什么是gdb2、gdb作用3、gdb可实现的功能三、GDB常用的调试命令一、与前面的联系 对于前面说到的launch.json文件就是用于debug的配置文件&#xff0c;在前面的vscode中我们可以发现配置好launch.json文件之后进行调试&#xff0c…

攻防世界-web2(逆向加密算法)

打开链接是PHP源码 给了一串密文&#xff0c;并对这串密文进行了一系列操作加密&#xff0c;注释里说解密$miwen就是flag 在此我们先介绍一些PHP内置函数&#xff1a; strrev(string): 反转字符串 strlen(string): 返回字符串的长度 substr(string, start, length): 返回字符…

认识、使用C++vetor和array

目录 前言&#xff1a; 1.vector模板 1.1vector简介 1.2创建vector类对象 2.array模板 2.1array简介 2.2创建array类对象 3.比较中学习 4.怎么避免数组越界访问 前言&#xff1a; 指针的基础用法分了近三篇文章&#xff0c;结合数组、结构、共用体、字符串一起学习。相…