java多线程(七)线程等待与唤醒

news2024/9/24 5:23:52

一、wait()、notify()、notifyAll()等方法介绍

在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。

Object类中关于等待/唤醒的API详细信息如下:
notify() – 唤醒在此对象监视器上等待的单个线程。
notifyAll() – 唤醒在此对象监视器上等待的所有线程。
wait() – 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)。
wait(long timeout) – 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。
wait(long timeout, int nanos) – 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量”,当前线程被唤醒(进入“就绪状态”)。

二、wait()和notify()示例


package com.demo.Thread;

public class ThreadA extends Thread{
    
    public ThreadA(String name){
        super(name);
    }
    
    public void run(){
        synchronized(this){
            System.out.println(Thread.currentThread().getName()+" call notify()");
             // 唤醒当前的wait线程
            notify();
        }
    }
}

package com.demo.Thread;
public class WaitTest {
    
    public static void main(String[] args){
        
        ThreadA t1 = new ThreadA("t1");
        
        synchronized(t1){
            try{
                 // 启动“线程t1”
                System.out.println(Thread.currentThread().getName()+" start t1");
                t1.start();
                
                // 主线程等待t1通过notify()唤醒。
                System.out.println(Thread.currentThread().getName()+" wait()");
                t1.wait();

                System.out.println(Thread.currentThread().getName()+" continue");

            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

运行结果

main start t1
main wait()
t1 call notify()
main continue

结果说明:

如下图,说明了“主线程”和“线程t1”的流程。

(01) 注意,图中"主线程" 代表“主线程main”。“线程t1” 代表WaitTest中启动的“线程t1”。 而“锁” 代表“t1这个对象的同步锁”。
(02) “主线程”通过 new ThreadA(“t1”) 新建“线程t1”。随后通过synchronized(t1)获取“t1对象的同步锁”。然后调用t1.start()启动“线程t1”。
(03) “主线程”执行t1.wait() 释放“t1对象的锁”并且进入“等待(阻塞)状态”。等待t1对象上的线程通过notify() 或 notifyAll()将其唤醒。
(04) “线程t1”运行之后,通过synchronized(this)获取“当前对象的锁”;接着调用notify()唤醒“当前对象上的等待线程”,也就是唤醒“主线程”。
(05) “线程t1”运行完毕之后,释放“当前对象的锁”。紧接着,“主线程”获取“t1对象的锁”,然后接着运行。

在这里插入图片描述
对于上面的代码?曾经有个朋友问到过:t1.wait()应该是让“线程t1”等待;但是,为什么却是让“主线程main”等待了呢?

注意:jdk的解释中,说wait()的作用是让“当前线程”等待,而“当前线程”是指正在cpu上运行的线程!
这也意味着,虽然t1.wait()是通过“线程t1”调用的wait()方法,但是调用t1.wait()的地方是在“主线程main”中。而主线程必须是“当前线程”,也就是运行状态,才可以执行t1.wait()。所以,此时的“当前线程”是“主线程main”!因此,t1.wait()是让“主线程”等待,而不是“线程t1”!

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

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

相关文章

阶段十:总结专题(第六章:缓存篇)

阶段十:总结专题(第六章:缓存篇)Day-第六章:缓存篇1. Redis 数据类型**String****List****Hash****Sorted Set**2. keys 命令问题3. 过期 key 的删除策略4. Redis 持久化**AOF 持久化****AOF 重写****RDB 持久化****混…

值得关注!可控生成!近期diffusion图像生成进展!

猜您喜欢:深入浅出stable diffusion:AI作画技术背后的潜在扩散模型论文解读戳我,查看GAN的系列专辑~!一顿午饭外卖,成为CV视觉的前沿弄潮儿!最新最全100篇汇总!生成扩散模型Diffusion ModelsECC…

JS中三种主要的遍历对象的方法:for in、Object.keys、Object.getOwnProperty

1、for in 主要用于遍历对象的可枚举属性,包括自有属性、继承自原型的属性 var obj {“name”:“tom”,“sex”:“male”}; Object.defineProperty(obj, “age”, {value:“18”, enumerable:false});//增加不可枚举的属性age Object.prototype.pro…

基于强化学习的多模态优化问题解空间聚类进化算法

Reinforcement-Learning-Based Evolutionary Algorithm Using Solution Space Clustering For Multimodal Optimization Problems 基于强化学习的多模态优化问题解空间聚类进化算法 摘要 在进化算法中,如何有效地选择用于生成后代的交互式解决方案是一个具有挑战性的…

《数据库系统概论》学习笔记——第二章 : 关系数据库

教材为数据库系统概论第五版(王珊) 这一章前面部分基本概念比较多,但学会对后面的学习有很大帮助。基本出题方向就是关于关系数据库的一些概念(比较多),然后计算题基本必考关系代数,一些基本的问…

UEditorPlus v2.9.0发布 文档仓库开源,修复若干问题

UEditor是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更符…

Hbase资源隔离操作指南

1.检查集群的环境配置 1.1 HBase版本号确认> 5.11.0 引入rsgroup的Patch: [HBASE-6721] RegionServer Group based Assignment - ASF JIRA RegionServer Group based Assignment 社区支持版本:2.0.0 引入rsgroup的CDH版本 5.11.0 https://www.…

高通平台开发系列讲解(Sensor篇)Gsensor基础知识

文章目录 一、什么是SENSOR?二、Sensor的分类及作用三、Gsensor的工作原理及介绍3.1、常见Gsensor3.2、Gsensor的特性沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍 Sensor 基础 一、什么是SENSOR? 传感器(英文名称:sensor )是一种检测装置,能感…

【Windows】U盘用完不能直接拔的原因?

小时候刚开始学习使用电脑时,总是被告知,用完U盘之后,一定要在电脑上先安全弹出USB设备之后才能拔掉,那时候就一直不明白为什么要这么做,而且最气的是有时候点击了安全弹出,结果被告知“正在使用无法弹出”…

换了固态硬盘需要重装系统吗?教你如何实现不重装系统!

电脑大家都用过嘛,如果您的计算机装的还是机械硬盘,想必阁下肯定是修身养性的高手,因为在这个浮躁的社会中,是很少有人能够忍受5分钟甚至更久的开机时间的,不仅开机慢,应用程序的响应速度也很慢&#xff0c…

STM32开发(16)----CubeMX配置DMA

CubeMX配置DMA前言一、什么是DMA?二、实验过程1.CubeMX配置2.代码实现3.实验结果总结前言 本章介绍使用STM32CubeMX对DMA进行配置的方法,DMA的原理、概念和特点,配置各个步骤的功能,并通过串口DMA传输实验方式验证。 一、什么是…

华为OD机试题,用 Java 解【最短耗时】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

关于IB学习,大学申请需要了解什么?

越来越多的孩子选择高中上IB课程,然而在IB学习中,会遇到很多问题,尤其是大学申请的问题,很多人还不是很了解。这里小编给大家整理了详细的解答。另外,还罗列了关于IB考试之后的相关问题,希望都能帮到学习IB…

pytorch入门6--数据分析(pandas)

pandas是基于Numpy构建的,提供了众多比NumPy更高级、更直观的数据处理功能,尤其是它的DataFrame数据结构,可以用处理数据库或电子表格的方式来处理分析数据。 使用Pandas前,需导入以下内容: import numpy as np from …

数据结构与算法之冒泡排序(含改进版)

目录冒泡排序概念代码实现时间复杂度代码改进冒泡排序概念 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再…

产品新说 | 指标的异常检测怎么做,能更好配合业务变化(二)

前言:上期分享我们提到了指标异常检测实践要素中的三个方面:以面对业务变动为前提,确定业务波动是周期性还是非周期性,进而选对算法;通过确认业务的常规指标,确定异常方向进行监测(上基带 / 下基…

【夏虫语冰】Win10局域网下两台电脑无法ping通: 无法访问目标主机

文章目录1、简介2、修改高级共享设置3、启用防火墙规则4、局域网内的其他主机访问NAT模式下的虚拟机4.1 虚拟机网络设置4.2 访问测试4.2.1 http测试4.2.2 curl测试4.2.3 telnet测试4.2.4 端口占用测试5、其他结语1、简介 ping 192.168.31.134ping主机ip时,访问无法…

华为OD机试模拟题 用 C++ 实现 - 学校运动会(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明学校运动会题目输入输出示例一输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…

Python--深入浅出的装饰器--2

前言如果上一章没怎么看懂,那么本章就放弃吧。好了,本章一起看看装饰器的另一种用法,带参数的装饰器。废话总结一下,经过前一章的学习,其实不难看出,装饰器的模板其实就是在此基础上,我们可以肆…

推荐几个实用的在线教程(建议收藏)

hello,大家好,我是木荣君。作为一名技术人员,工作中熟练使用各种管理及设计工具是一项必备的技能。今天给大家分享一下我工作中经常查看和学习的几个在线教程地址。供大家参考学习,建议收藏,真的很实用! Gi…