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

在这里插入图片描述

上一篇:Java高并发系列(读书笔记)——等待线程结束(join)和谦让(yield)
下一篇:Java高并发系列(读书笔记)——相关的重要概念和并发级别

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年03月26日 08时24分49秒