线程等待通知 linux,Java 线程协作 wait(等待)与 notiy(通知)

一.wait()、notify()和notifyAll()

为了更好的支持多线程之间的协作,JDK提供了三个重要的本地方法

//调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的锁.

public final void wait() throws InterruptedException {

wait(0);

}

//调用某个对象的notify()方法能够唤醒一个正在等待这个对象的锁的线程,如果有多个线程都在等待这个对象的锁,则只能唤醒其中一个线程

public final native void notify();

//notifyAll()方法能够唤醒所有正在等待这个对象锁的线程;

public final native void notifyAll();

38926ffb07532e77fec4fd5603c9e059.png

如图:当一个拥有Object锁的线程调用 wait()方法时,就会使当前线程加入object.wait 等待队列中,并且释放当前占用的Object锁,这样其他线程就有机会获取这个Object锁,获得Object锁的线程调用notify()方法,就能在Object.wait 等待队列中随机唤醒一个线程(该唤醒是随机的与加入的顺序无关,优先级高的被唤醒概率会高),若果调用notifyAll()方法就唤醒全部的线程。注意:调用notify()方法后并不会立即释放object锁,会等待该线程执行完毕后释放Object锁。

代码:

public class WaitTest {

private static Object object=new Object();

public static void main(String[] args) {

Thread thread=new Thread(){

@Override

public void run() {

synchronized (object) {

System.out.println(System.currentTimeMillis()+":"+Thread.currentThread().getName()+"进入启动");

try {

object.wait();//使当前线程进入等待(进入Object.wait队列)并释放对象锁

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(System.currentTimeMillis()+":"+Thread.currentThread().getName()+"线程执行结束");

}

}

};

thread.start();

Thread thread_2=new Thread(){

@Override

public void run() {

synchronized (object) {

System.out.println(System.currentTimeMillis()+":"+Thread.currentThread().getName()+"进入启动");

try {

object.notify();//随机在Object.waitd队列中唤醒一个正在等待该对象锁的线程

System.out.println(System.currentTimeMillis()+":"+Thread.currentThread().getName()+"唤醒一个等待的线程");

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

};

thread_2.start();

}

}

执行结果:

1473306408730:Thread-0进入启动

1473306408731:Thread-1进入启动

1473306408731:Thread-1唤醒一个等待的线程

1473306418731:Thread-0线程执行结束

从时间戳中可以看出 Thread-1 在通知Thread-0 继续执行后,Thread-0 并未立即执行,而是等待Thread-1 释放Object锁,在重新获得Object锁后,才能继续执行。(最后两个时间戳相减刚好是10秒)

0b1331709591d260c1c78e86d0c51c18.png

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

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

相关文章

新买的笔记本电脑怎么分盘_别再吐槽游戏本越玩越慢:笔记本电脑降速揭秘+散热维护小贴士...

花大价钱买的电竞本,配置越高?降速越狠?夏天到了,日益升高的温度不会影响我们日常搞机的热情~ 新买的4核、6核、8核游戏本照样在各大游戏中征战四方。然而,为什么明明配置很高的笔记本电脑,突然变得如老牛拉…

zenmap nmap输出无显示_双路显示控制仪XME-H80-1616价格报价

双路显示控制仪XME-H80-1616价格报价 主要性能二十多种输入信号可选择: 测量输入信号可进行开方及小信号切除。 过程量、给定值、控制量、阀位反馈量等多重显示;测量值与给定值的显示可进行加减运算。 控制量PID调节正反作用选择。 可设置PID调节器的上下…

capture 部分元器件编号_十大电子元器件及其相关基础知识

导读对于从事电子行业的工程师来说,电子元器件是每天都需要去接触,每天都需要用到的,但其实里面的门门道道很多工程师未必了解。文中列举出工程师们常用的十大电子元器件,及相关的基础概念和知识。常用电子元器件有哪些&#xff1…

苹果笔记本能玩英雄联盟吗_英雄联盟手游可以玩云顶之弈吗 独立还是内置

众所周知,端游云顶之弈和英雄联盟是一个客户端的,必须下载英雄联盟才能玩云顶之弈。那么Lol手游内能否玩上云顶之弈手游呢?今日光耀菌就解答这个问题,留有疑惑的玩家们快来了解一番吧!LOL手游能玩云顶之弈吗?首先目前版本的lol手游内&#…

win10关机后自动重启_Win10关机风扇还在转|解决win10关机后风扇继续转方法

Win10如果配合固态硬盘使用,可以实现开关机速度快。但是有些用户发现电脑在关机的时候,屏幕是关掉了,可风扇还继续在转,其主要原因是因为系统还没有完全关闭导致的,这篇文章系统部落将会给大家带来两个解决方法&#x…

linux ssh 插件,玩转VSCode插件之Remote-SSH的使用情况

前言每当更换电脑就要从新搭建一遍开发环境。。。每当拉完最新代码程序在本地跑不起来的时候就要检查服务器和开发电脑的环境。。。每当服务器上出Bug的时候就想如果可以能够调试服务器代码多好啊。。你是不是早就受够了vim这个煞笔编辑器。。。现在最火的是云原生应用&#xf…

保护眼睛的电脑设置_干货,怎么设置显示器,才能保护好我们的眼睛?

复工开始,网课不断,我们的眼睛又迎来了一波挑战!你是不是有的时候会因为长时间用眼看显示器而流泪不止(不是因为看电视剧感动哈),或者是长时间工作而眼部疲劳,你也明白一直用显示器伤眼可是不得不用!楼主去…

html输入密码跳转页面_【小乔锦囊】角色/仓库密码无法清除,怎么办?

— ◆ 小 乔 锦 囊 ◆ —近期,小乔收到玩家宝宝们的提问:在客服专区中进行角色或仓库密码的清除时,会收到登录验证失败的提示,应该怎么办?辛苦玩家宝宝们的热心反馈!该问题目前已在紧急修复中。同时&#x…

linux redis 5.6扩展,Windows下为PHP5.6安装Redis扩展和memcached扩展

2.根据PHP版本号,编译器版本号和CPU架构,选择php_redis-2.2.5-5.6-ts-vc11-x64.zip和php_igbinary-1.2.1-5.5-ts-vc11-x64.zip下载地址:http://windows.php.net/downloads/pecl/snaps/redis/2.2.5/http://windows.php.net/downloads/pecl/rel…

string拼接_String拼接操作-的优化

很多讲Java优化的文章都会强调对String拼接的优化。倒不用特意记,本质上在于对不可变类优势和劣势的理解上。需要关注的是编译器对String拼接做出的优化,在简单场景下的性能能够与StringBuilder相当,复杂场景下仍然有较大的性能问题。网上关于…

cesium加载entity图片缩放_Cesium中级教程4 – 空间数据可视化(二)

Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/Viewer中的Entity功能让我们看看Viewer为操作entities提供出来的功能函数。选中和描述点击Viewer中的entity将在entity的位置上呈现SelectionIndicator控件,提…

python 模糊匹配_很冷门,但非常实用的 Python 库

Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使它成为全世界用户(初学者和高级用户)的合适选择。它的成功和流行的原因之一是它强…

python数据可视化是什么_Python数据分析:可视化

本文是《数据蛙三个月强化课》的第二篇总结教程,如果想要了解数据蛙社群,可以阅读对于我们数据分析师来说,不仅要自己明白数据背后的含义,而且还要给老板更直观的展示数据的意义。所以,对于这项不可缺少的技能&#xf…

ENSP配置 实例一 不同VLAN间通信

ENSP配置 实例一 不同VLAN间通信 SW1 [SW1]vlan batch 10 20 [SW1]interface g0/0/1 [SW1-GigabitEthernet0/0/1]port link-type access [SW1-GigabitEthernet0/0/1]port default vlan 10 [SW1-GigabitEthernet0/0/1]int g0/0/2 [SW1-GigabitEthernet0/0/2]port link-type acce…

ENSP配置 实例二 单臂路由配置

ENSP配置 实例二 单臂路由配置 单臂路由配置 配置 路由: interface EigabitEthernet0/0/0 ip address 10.0.1.1 24 interface EigabitEthernet0/0/0.1 dot1q termination vid 10 ip address 192.168.1.254 24 arp broadcast enable interface EigabitEthernet0/0/…

用python画数学函数图像教程_Python 绘制你想要的数学函数图形

Python 非常热门,但除非工作需要没有刻意去了解更多,直到有个函数图要绘制,想起了它。结果发现,完全用不着明白什么是编程,就可以使用它完成很多数学函数图的绘制。 通过以下两个步骤,就可以进行数学函数的…

ENSP配置 实例三 静态路由配置

ENSP配置 实例三 静态路由配置 R1配置命令 system-view [R1]interface Ethernet 0/0/0 [R1-Ethernet0/0/0]ip add 192.168.1.254 24 [R1-Ethernet0/0/0]quit [R1]interface tEthernet 0/0/1 [R1-Ethernet0/0/1]ip addr 10.0.12.1 24 [R1-Ethernet0/0/1]quit [R1]ip route-stati…

python 散点图 不同颜色_python – pandas – 每个点都有不同颜色图例的散点图

以下方法将根据您的数据框创建颜色列表,然后使用每种颜色的标签绘制一个点: import matplotlib.pyplot as plt import matplotlib.cm as cm import matplotlib.colors as colors import numpy as np import pandas as pd fig, ax plt.subplots() df pd.DataFrame(…

ENSP配置 实例四 默认路由配置

ENSP默认路由配置 1,配置R1路由器 sys ##进入系统视图模式 [Huawei]sys R1 ##修改名字 [R1]int e0/0/0 ##进入接口 [R1-Ethernet0/0/0]ip add 192.168.1.254 24 ##配置ip地址 [R1-Ethernet0/0/0]undo shut ##开启物理接口 [R1-Ethernet0/0/1]int e0/0/1 [R1-Etherne…

ENSP配置 实例五 RIP配置

ENSP配置 实例五 RIP配置 配置 R1 sy [Huawei]sy R1 [R1]int e0/0/0 [R1-Ethernet0/0/0]ip add 192.168.1.254 24 [R1-Ethernet0/0/0]int e0/0/1 [R1-Ethernet0/0/1]ip add 10.0.12.1 24 [R1-Ethernet0/0/1]q [R1]rip 1 [R1-rip-1]network 192.168.1.0 [R1-rip-1]network 10.0.…