zoukankan      html  css  js  c++  java
  • Java 等待/通知机制

    等待/通知的目的是确保等待线程从wait()方法返回时能够感知到通知线程对变量所做出的的修改;

     

    等待方遵循如下原则:

    1.获取对象的锁

    2.如果条件不满足,那么调用对象的wait()方法,被通知后任要检查条件

    3.条件满足则进行对于的逻辑

     

    伪代码如下:

     synchronized(对象) {
         while (条件不满足) {
             对象.wait();
         }
         
         对应的逻辑;
     }
    

      

    通知方遵循如下原则:

    1.获得对象的锁

    2.改变条件

    3.通知所有等待在对象上的线程

     

    对应的伪代码如下:

     synchronized(对象) {
         改变条件
         对象.notifyAll();
     }
    

      

    需要注意

    1.使用wait(),notify()和notifyAll()时需要先调用对象加锁

    2.使用wait()方法后,线程状态由RUNNING变为WAITING,并将当前线程放置到对象的等待队列

    3.notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifyAll()的线程释放锁之后,等待线程才会有机会从wait()返回

    4.notify()方法将等待队列中的一个等待线程从等待队列中移动到同步队列,而notifyAll()方法则时将等待队列中所有的线程全部移到同步队列,被移动的线程的状态由WAITING变为BLOCKED;

    5.从wait()方法返回的前提是获得了所有调用对象的锁

     

    等待超时模式

    假设超时时间段时T,那么可以推断在当前时间 now + T之后就好超时;

    定义如下变量:

    • 等待持续时间:REMAINING = T

    • 超时时间:FUTURE = now + T

    这时仅需要wait(REMAINING) 即可,在wait(REMAINING)返回之后将会执行:REMAINING = FUTURE - now;如果REMAINING 小于等于0,表示已经超时,直接退出,否则将继续执行wait(REMAINING);

     

    伪代码如下:

     public synchronized Object get(long mills) throw InterruptedException {
         long future = System.currentTimeMillis() + mills;
         long remaining = mills;
         
         //当超时大于0并且result返回值不满足要求
         while ((result == null) && remaining > 0) {
             wait(remaining);
             remaining = future - System.currentTimeMillis();
         }
         
         return result;
     }
    

      

     

  • 相关阅读:
    第六周学习总结
    20165227 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
    第五周学习总结
    20165227 20165228结对学习感想
    第四周课堂测试补做
    第四周作业
    20165227第三周学习总结
    第二周学习总结
    20165304《JAVA程序设计》第四周学习总结
    20165304 2017-2018-2 《Java程序设计》第3周学习总结
  • 原文地址:https://www.cnblogs.com/coder-zyc/p/12485161.html
Copyright © 2011-2022 走看看