
Java高并发系列(读书笔记)——等待(wait)和通知(notify)机制
发布日期:2021-05-04 18:18:20
浏览次数:10
分类:技术文章
本文共 2063 字,大约阅读时间需要 6 分钟。
等待(wait)和通知(notify)
这两个方法是在Object类中,任何对象都可以调用。
public final void wait()throws InterruptedExceptionpublic final native void notify()
如果 一个线程调用了object.wait(),那么它就会进入object对象的等待队列。这个等待队列中,可能会有多个线程,因为系统运行多个线程同时等待某一个对象。当object.nofity()被调用时,它就会从这个等待队列中,随机选择一个线程,(也不是优先通知优先级比较高的线程)并将期唤醒。这里希望大家注意的是,这个选择是不公平的,并不是先等待的线程会优先被选择,这个选择完全是随机的。
除了nofity()方法外,Obect对象还有一个类似的notifyAll()方法,它和notify()的功能基本一致,但不同的是,它会唤醒在这个等待队列所有等待的线程,而不是随机选择一个。这里要注意notifyAll唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的。
这里还需要强调一点,wait()方法并不是可以随便调用的,它必须包含在对应的synchronzied语句中,无论是wait()或者notify()都需要首先获得目标对象的一个监视器。
当需要调用以上的方法的时候,一定要对竞争资源进行加锁,如果不加锁的话,则会报 IllegalMonitorStateException 异常。
下面这个代码是使用了wait()和notify()方法的简单代码案例
public class thread03 { final static Object object = new Object(); public static class T1 extends Thread{ @Override public void run(){ //在执行wait()方法时先申请获取object的对象锁 synchronized (object){ System.out.println(System.currentTimeMillis()+":开启线程T1!!!"); try { System.out.println(System.currentTimeMillis()+":将线程T1加入等待队列中!!!"); object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(System.currentTimeMillis()+":结束线程T1!!!"); } } } public static class T2 extends Thread{ @Override public void run(){ //在执行notify()方法时先申请获取object的对象锁 synchronized (object){ System.out.println(System.currentTimeMillis()+":开启线程T2!!!唤醒等待队列中的线程T1"); object.notify(); System.out.println(System.currentTimeMillis()+":结束线程T2!!!"); try { //将线程T2休眠2秒 Thread.sleep(2000); } catch (InterruptedException e) { } } } } public static void main(String[] args) { Thread t1 = new T1(); Thread t2 = new T2(); t1.start(); t2.start(); }}
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年03月26日 08时24分49秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java 十大排序算法
2019-03-03
SQL触发器
2019-03-03
springboot运行时该注意的地方
2019-03-03
建立第一个SpringBoot小列子(碰到的错误)
2019-03-03
处理in查询的时候id超过1000,而报错
2019-03-03
Eclipse+Java+Swing实现学生成绩管理系统
2019-03-03
BZOJ3685: 普通van Emde Boas树
2019-03-03
懵逼ZJOI2016Round2滚粗记
2019-03-03
海盗分赃(8行代码搞定!)
2019-03-03
整型关键字的散列映射
2019-03-03
多位水仙花数-python(出现运行超时?不妨用减法计算)
2019-03-03
地下迷宫探索(后两个测试点无法通过?这里有你想要的答案)
2019-03-03
城市间紧急救援(dijkstra算法)
2019-03-03
关键活动(注释超详细!!!)
2019-03-03
为什么Android要采用Binder作为IPC机制?成功入职阿里
2019-03-03
大牛手把手带你!Flutter尽然还能有这种操作!面试建议
2019-03-03
如何成为一个更好的Android开发者?写给正在求职的安卓开发
2019-03-03
小白看完都会了!阿里云大师深入拆解Java虚拟机,看完这一篇你就懂了
2019-03-03
【IT之路】MySQL基础-MySQL常见操作
2019-03-03
【IT之路】Docker系列-CentOS Docker 安装
2019-03-03