【JavaEE初阶】简单了解wait和notify方法~

news/2024/11/18 1:43:29/

目录

🌟1、wait()

🌟2、notify()


🌟1、wait()

        (1)wait()方法与notify()方法都是Object类中的方法。

        (2)wait()是让线程等待一段时间,死等——>状态WAITING:没有时间限制的等待.

        (3)wait(long) 是让线程等待一段时间,过时不候——>TIMED_WAITING:有时间限制的等待。

        wait()必须与关键字synchronized联合使用,否则会报错。

❓ 问题1:区分wait()与join()

        (1)wait()是Obejct类中的方法,join()是Thread类中的方法;

        (2) join()是让调用方去等待,wait()是让执行方去等待。


        🌰导师告诉班长,现在要去辅导员办公室取一份资料回来签字。班长过去了🧑,发现学院里所有的班长都来了,资料不过,现在还在打印中,让大家全部都等待一会。😫这个班长等待的过程其实就是执行方等待。等到所有的资料都打印完毕,辅导员这时候喊一声:所有的班长都过来,怎么就是notifyAll(),唤醒了所有的线程;如果是只喊了一个一班的班长来一下,那就是notify(),只唤醒了一个线程,其他的线程还在等待。等到班长终于拿好资料回去找导师的时候,导师在这期间等待的过程就是一个调用方等待。你理解了吗~😆


❓ 问题2:区分wait()与sleep()

        (1)wait与sleep是完全没有可比性的🤣一个是用于县城之间的通信,另一个是让线程阻塞等待的。不过都是可以让线程放弃执行一段时间;

        (2) wait()是Object类中的方法,sleep()是Thread类中定义的方法;

        (3) wait()必须要和synchronized关键字搭配使用,调用之后会释放锁;sleep()只是让线程进入休眠状态,和锁毫无关系。

🌟2、notify()

        notify(): 只唤醒等待中的一个线程,并直接参与锁竞争;

        notifyAll:() : 一次性唤醒等待中的所有线程,线程共同去参与锁竞争。

🌰  wait与notify必须是同一个锁对象,wait必须与synchronized搭配使用。 wait与notify被调用后,当前线程都会释放锁资源。

private static Object locker = new Object();public static void main(String[] args) {Thread t1 = new Thread(()->{while (true){System.out.println("t1在等待之前");try {synchronized (locker) {locker.wait();}} catch (InterruptedException e) {e.printStackTrace();}System.out.println("t1在等待之后");System.out.println("=============================");}});t1.start();Thread t2 = new Thread(()->{while (true){System.out.println("t2唤醒之前");//唤醒时也要使用同一个锁对象synchronized (locker) {locker.notify();}System.out.println("t2唤醒之后");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t2.start();}

控制台输出: 


        中午继续努力~ 

 

 

 


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

相关文章

JAVA有哪些特点?

JAVA有以下特点: 综上所述,Java作为一种先进的面向对象编程语言,具有简单、可移植、健壮、高性能、多线程、动态性、跨平台、开放性和安全性等众多特点,已经成为广泛使用的编程语言之一。 简单易学:JAVA语言的语法与C语…

105-Linux_Libevent库的安装与使用

文章目录 一.Libevent 概述1.Libevent的特点2.Libevent使用模型3.Libevent 支持的事件类型 二.Libevent的安装三.Libevent简单使用实例 一.Libevent 概述 Libevent 是开源社区的一款高性能的 I/O 框架库,使用 Libevent 的著名案例有:高性能的分布式内存…

成功解决:ubuntu下ifconfig不显示网卡信息

目录 前言方法一(临时)方法二第一步第二步第三步 前言 好久没动电脑虚拟机,今天打开ubuntu发现右上角没有网络图标,打开终端ping不同百度,再输入ifconfig发现不显示网卡信息,于是开始尝试各种方式&#xf…

Insix:面向真实的生成数据增强,用于Nuclei实例分割

文章目录 InsMix: Towards Realistic Generative Data Augmentation for Nuclei Instance Segmentation摘要本文方法数据增强方法具有形态学约束的前景增强提高鲁棒性的背景扰动 实验结果 InsMix: Towards Realistic Generative Data Augmentation for Nuclei Instance Segment…

SpringCloudAlibaba整合Ribbon实现负载均衡调用

目录 一、概念 二、整合Ribbon负载均衡 三、Ribbon架构原理图 四、Ribbon默认调用与

leetcode 674. 最长连续递增序列

题目描述解题思路执行结果 leetcode 674. 最长连续递增序列 题目描述 最长连续递增序列 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&a…

SQL 招聘网站岗位数据分析

数据清洗 1.删除包含空字段的行 create view v_data_clean_null as select * from data d where job_href is not null and job_href ! and job_name is not null and job_name ! and company_href is not null and company_href ! and company_name is not null and com…

Golang-map底层原理刨析

map底层原理刨析 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yz8FjpJt-1683362716010)(https://gitee.com/cqfbest/md/raw/master/img2//v2-95697e3e2584722431ab1c37f3a61736_1440w.jpg)] Go 语言内置了 map 数据结构, map 的底层便是一个 Has…