首页 > 编程语言 >Java并发(二十四)----wait、notify、notifyAll、join区别与联系

Java并发(二十四)----wait、notify、notifyAll、join区别与联系

时间:2024-04-07 20:46:51浏览次数:29  
标签:Java notifyAll t1 ---- 线程 notify join 等待 wait

1、join

是调用者轮询检查线程 alive 状态,执行后线程进入阻塞状态。

如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到join结束或中断线程B才开始进入阻塞队列。可以实现一个线程的顺序执行。

t1.join();

等价于下面的代码

synchronized (t1) {
    // 调用者线程进入 t1 的 waitSet 等待, 直到 t1 运行结束
    while (t1.isAlive()) {
        t1.wait(0);
    }
}

注意

join 体现的是【保护性暂停】模式,请参考Java并发(二十二)----同步模式之保护性暂停 中第四小节:带超时版 GuardedObject

2、wait()和notify()、notifyAll()

1、wait方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用

2、wait()方法使当前线程暂停执行并释放会cpu资源,以及同步锁(类锁和对象锁)

3、调用wait()后必须调用notify()或notifyAll()后线程才会从等待池进入到锁池,当我们的线程竞争得到同步锁后就会重新进入绪状态等待cpu资源分配

当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

注意:

1、这三个方法都是java.lang.Object的方法。

2、notif()方法要配合wait()方法使用,一般在wait()之后调用或者在线程结束时调用才会成功。

 

标签:Java,notifyAll,t1,----,线程,notify,join,等待,wait
From: https://www.cnblogs.com/xiaoyh/p/17161719.html

相关文章

  • L3-008 喊山
    DFS。#include<bits/stdc++.h>usingnamespacestd;constintinf=0x3f3f3f3f;vector<vector<int>>vec;intvis[10003];intmain(){ intn,m,k; cin>>n>>m>>k; vec.resize(n+10); while(m--){ inta,b; cin>>a&......
  • Vscode+gcc-arm+openocd搭建STM32开发环境
    1简介尝试使用Vscode搭建STM32开发环境,自己记录一下详细的配置过程2工具下载设计到的相关软件以及资源包括Vscode软件、STM32CubeMX、mingw64以及openocd,相应的软件介绍以及下载链接如下:Vscode软件:宇宙第一编辑器,开源,插件丰富CubeMx:初始化代码生产器,HAL库mingw64:因......
  • 全屋光纤(Fiber-to-the-Home,FTTH)
     全屋光纤(Fiber-to-the-Home,FTTH)的起源可以追溯到光纤通信技术的发展历程。光纤通信是一种利用光纤作为传输介质,将信息转换成光信号进行传输的通信技术,具有高速、大带宽、低损耗等优势。20世纪末,随着互联网的普及和数字化技术的发展,人们对网络带宽的需求越来越高。传统的电......
  • make编译报错:fatal error: filesystem: 没有那个文件或目录 #include <filesystem>
    报错:fatalerror:filesystem:没有那个文件或目录#include(filesystem)解决方法一:修改头文件#include<experimental/filesystem>添加依赖在编译时,后面添加:-lstdc++fs编译通过。解决方法二:升级gcc升级到gcc-8或8以上问题即可解决:添加PPA存储库首先,您需要添加Ub......
  • 探究MySQL8.0驱动的加载
    探究MySQL8.0驱动的加载大家在连接mysql的时候,启动项目,会警告你推荐使用com.mysql.cj.jdbc.Driver而不是com.mysql.jdbc.Driver那么这两者到底有什么区别呢本质区别:com.mysql.jdbc.Driver是mysql-connector-java5中的,需要手动加载驱动com.mysql.cj.jdbc.Driver是mysql......
  • C++:类的继承
    基类的构造函数和析构函数不会被继承,但是当子类对象初始化时则会自动调用基类的构造函数和析构函数(默认)如果想要调用基类的重载构造函数,需要在构造函数后加上“:<重载的构造函数>{};”,如下classFATHER{public:FATHER();~FATHER();FATHER(inta)//重载......
  • 探究MySQL8.0驱动的加载
    探究MySQL8.0驱动的加载大家在连接mysql的时候,启动项目,会警告你推荐使用com.mysql.cj.jdbc.Driver而不是com.mysql.jdbc.Driver那么这两者到底有什么区别呢本质区别:com.mysql.jdbc.Driver是mysql-connector-java5中的,需要手动加载驱动com.mysql.cj.jdbc.Driver是mysql-......
  • Matlab 安装及添加 SPM 12
    Matlab安装及添加SPM12因为课题需要,需要学习Matlab的使用,又开始学习一个新的知识!快乐的(bcd)研究生~~~下载安装Matlab首先我从网上一些资源那里下载了Matlab安装压缩包(从百度网盘下的,压缩包都12.02G!下了我好久啊!!!)下载完成后就是这样子的啦~然后进行解压安装(这里解压也......
  • 事件循环
    事件循环单线程是异步产生的原因事件循环是异步的实现方式浏览器的进程模型何为进程?程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意何为线程?有了进程后,就可以运行程序的代码了......
  • 437. 路径总和 III
    题面核心思想树上的前缀和o(n)当前的前缀和:curSum前面的前缀和:preSum如果curSum-preSum==target就说明有一段区间和为target,preSum出现了几次就有几段区间,所以用map存储前缀和出现的次数代码classSolution{privateintres=0;//437.路径总和III......