美文网首页
等待/通知机制

等待/通知机制

作者: caster | 来源:发表于2021-03-15 16:29 被阅读0次

具体流程:一个线程(生产者)修改(nofity)一个对象,另一个线程(消费者)感知到变化(wait中...)开始进行操作。
作用:Java的等待/通知机制使消费者不需要循环一直监控对象是否变化,节约资源。
实现原理:使用某个对象的锁来实现,Java任意对象都具有此机制,因为表中五个方法定义在Object类上。

方法 说明
notify() 线程调用了某对象的notify(),并释放此对象的锁后,等待线程(调用过此对象的wait()方法)有机会(如果获取到了该对象的锁)从wait()中返回。
notifyAll() notifyAll()将等待队列中的全部线程移动到同步队列,被移动的线程状态由WAITING变为BLOCKED。
wait() 线程内调用了某对象的wait()后会转入waiting状态,并将此线程放置到这个对象的等待队列。
wait(long) 设置等待时间,超时则跳过等待继续执行。
wait(long,int) 细粒度控制超时时间。

锁和对象的关系:
每个java对象头中都有锁状态位标记。java中在使用synchronize同步的时候,肯定是涉及到某个对象的锁。因此,在考虑同步的时候,首先要想到是同步的是哪个对象的锁。
在java字节码上,获取了某个对象的锁之后,进入时会调用monitorenter指令,在退出时会调用monitorexit指令。可见,java object monitor是对java对象的锁的一种抽象。它和java对象是一对一的关系的。
在java中,通过java object monitor使得锁是和其保护的对象一一对应的。
只有拥有了该对象的锁,才可以调用以上5个方法,所以上述5个方法需要在synchronized代码块中使用,代码例例如下:

import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Currrent {
    //用于操作的对象 monitor 锁
    public static Object object = new Object();
    public static void main(String[] args) throws InterruptedException {
        Wait thread1 = new Wait("wait1");
        Wait thread2 = new Wait("wait2");
        Wait thread3 = new Wait("wait3");
        Notify notify = new Notify("notify");

        //三个线程开始进入wait()
        thread1.start();
        thread2.start();
        thread3.start();

        Thread.sleep(1000);

        //唤醒线程进行notify()
        notify.start();
    }

    static class Wait extends Thread{
        private  String name;
        public Wait(String name) {
            this.name=name;
        }
        @Override
        public void run() {
            synchronized (object) {
                try {
                    System.out.println("线程"+this.name+"进入");
                    //当前线程进入等待队列
                    object.wait(10000);
                    System.out.println("线程"+this.name+"结束wait");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程"+this.name+"完成");
            }
        }
    }

    static class Notify extends Thread{
        private  String name;
        public Notify(String name) {
            this.name=name;
        }
        @Override
        public void run() {
            synchronized (object) {
                //所有在对象object等待队列中的线程进入阻塞度列
                object.notify();
                System.out.println("线程"+this.name+"调用了object.notify()");
                System.out.println("线程"+this.name+"释放了锁");
                //此线程释放了object对象的锁,等待队列中的某个线程将会获取并继续执行wait()方法之后的代码
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程"+this.name+"锁外内容");
        }
    }
}

相关文章

  • 等待/通知机制

    等待/通知机制 场景 吃饭 : 一家人要吃午饭,妈妈做饭,我和爸爸吃饭。让我和爸爸的坐在桌子旁准备吃饭。但是我和爸...

  • 等待&通知机制

    等待/通知机制 什么是等待/通知机制? 举例说明,厨师和服务员之间的交互: 厨师做完一道菜的时间不确定,所以厨师将...

  • 等待/通知机制

    原文地址:https://hexige.github.io/blog/2017/09/25/%E7%AD%89%E...

  • 等待 - 通知机制

    一个完整的等待 - 通知机制:线程首先获取互斥锁,当线程要求的条件不满足时,释放互斥锁,进入等待状态;当要求的条件...

  • 等待/通知机制

    具体流程:一个线程(生产者)修改(nofity)一个对象,另一个线程(消费者)感知到变化(wait中...)开始进...

  • Thread等待通知机制

  • 线程等待通知机制

    机制的由来 一 个 线 程 修 改 了 一 个 对 象 的 值, 而 另 一 个 线 程 感 知 到 了 变 化,...

  • 线程间通信

    1 Java经典的等待/通知机制 在java中的等待通知机制就是,一个线程让其他线程从wait方法返回。前提:wa...

  • Java并发编程基础-线程间通信

    章节目录 volatile 与 synchronized 关键字 等待/通知机制 等待/通知经典范式 管道输入/输...

  • 再谈ReentrantLock之2

    Condition Lock的等待通知机制,一般这么用: 等待: 通知: await 1.将线程加入到等待队列 先...

网友评论

      本文标题:等待/通知机制

      本文链接:https://www.haomeiwen.com/subject/nvikcltx.html