博客
关于我
Java高并发系列(读书笔记)——等待(wait)和通知(notify)机制
阅读量:261 次
发布时间:2019-03-01

本文共 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();    }}

在这里插入图片描述

转载地址:http://oqjo.baihongyu.com/

你可能感兴趣的文章
HDU - 1114 Piggy-Bank(dp_完全背包)
查看>>
2017ccpc杭州 E. Master of Subgraph(点分治 + 树dp + bitset)
查看>>
HDU - 4597 Play Game (博弈 + 区间dp)
查看>>
Educational Codeforces Round 99 (Rated for Div. 2)(A-E)
查看>>
2021牛客寒假算法基础集训营3
查看>>
codeforces1485D.Multiples and Power Differences(思维)
查看>>
C++ | 虚拟地址空间
查看>>
int 越界处理
查看>>
Linux-调试器(gdb)、make&&makefile、git操作(图文并茂)
查看>>
营收环比增幅近50%,星巴克在经历“劫”后重生吗?
查看>>
苹果进军搜索,背后藏着什么“阳谋”?
查看>>
上市两年后迎首次盈利,拼多多“稳”了吗?
查看>>
Q3净利增89倍股价却大跌,疫苗来了Zoom狂奔速度将熄火?
查看>>
ARK女神持仓每日跟踪-2021年01月05日
查看>>
ARK女神持仓每日跟踪|2021年01月06日
查看>>
php:require、require_once、include和include_once
查看>>
react:redux和react-redux
查看>>
js:详解js中的伪数组
查看>>
egg:如何在控制器中拿到前端传的参数
查看>>
vue系列:vue中使用vee-validate3表单验证
查看>>