zoukankan      html  css  js  c++  java
  • 等待与通知范式

    1.背景

    一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个

    过程开始于一个线程,而最终执行又是另一个线程。

    2. 解决方案

    2.1 轮询方式

    让消费者线程不断地循环检查变量是否符合预期

    // 伪代码
    while(value != desire) {
        Thread.sleep(1000);
    }
    doSomething();
    

    2.2 等待通知范式

    利用Object上的wait()和notify()方法进行线程间的交互

     // A线程
     synchronized(对象){
          while(条件不满足){
          	对象.wait();
          }
          对应的处理逻辑
      }
    // B线程
    synchronized(对象){
         改变条件
         对象.notifyAll();
     }
    

    2.3 优缺点对比

    轮询方式不仅消耗CPU,而且没有及时性.

    3.实现

    public class NotifyWait {
    
        static Object lock = new Object();
    
        static volatile boolean flag = true;
    
        public static void main(String[] args) throws InterruptedException {
            Thread waitThread = new Thread(new Wait(), "WaitThread");
            waitThread.start();
            TimeUnit.SECONDS.sleep(1);
            Thread notifyThread = new Thread(new Notify(), "NotifyThread");
            notifyThread.start();
        }
    
        static class Wait implements Runnable {
            @Override
            public void run() {
                synchronized (lock) {
                    while (flag) {
                        try {
                            System.out.println("准备下好好工作了");
                            System.out.println("WAIT,我快要进入等待队列了,好难受呀");
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
    
                    System.out.println("终于能好好工作了");
                }
            }
        }
    
        static class Notify implements Runnable {
    
            @Override
            public void run() {
                synchronized (lock) {
                    flag = false;
                    System.out.println("NOTIFY,我要脱离等待队列了,好高兴呀");
                    lock.notifyAll();
                }
            }
        }
    
    }
    

    执行结果

    准备下好好工作了
    WAIT,我快要进入等待队列了,好难受呀
    NOTIFY,我要脱离等待队列了,好高兴呀
    终于能好好工作了
    
  • 相关阅读:
    java 计算文件 md5值
    前端项目结构
    路由器下连接路由器教程
    idea 中抽取部分代码
    idea 多行注释 Ctrl shift / 失效问题
    idea Ctrl+shift+F 快捷键失效原因
    Android studio 安装 jrebel for Android 下载不了问题
    利用C#创建和安装一个windows服务
    25条提高Visual Studio编码和调试效率的技巧
    IIS解决 上传文件大小限制
  • 原文地址:https://www.cnblogs.com/theodorezhang/p/11851503.html
Copyright © 2011-2022 走看看