zoukankan      html  css  js  c++  java
  • 【Java】多线程学习——wait、notify和notifyAll

        Java多线程非常复杂,可以使用BlockingQueue和Executor等工具类来简化使用。但还是要弄清wait()、notify()和notifyAll()的作用和用法。它们都是Object类中的native方法。

    一、wait()

      作用:告诉当前调用它的方法释放锁并sleep,直到其它某个线程也进入sleep状态且调用notify()方法。

      注意:该线程在进入waiting之前释放锁,并在wait()方法返回之前重新获取锁。也就是说wait()方法调用之后线程释放锁,然后进入waiting状态。

        一直到其它的线程调用notify方法,并轮到本线程的时候,wait方法才返回。

      示例:    

    synchronized(lockObj){
        while(!condition){
            lockObj.wait();
        }     
        //其它代码   
    }

    二、notify()

      作用:唤醒在同一锁对象上的一个线程。

      注意:调用notify()并不立即释放锁。它只是告诉某个正在等待的线程可以被唤醒,当同步快的所有代码执行完之后,锁才会被真正释放。

      示例:

    synchronized(lockObj)
    { 
        //建立条件
    
        lockObject.notify();   
      
        //其他需要被执行的代码
    }

    三、notifyAll()

      与notify()方法的区别是:它唤醒所有在同一锁对象的所有线程。大部分情况下,最高优先级的线程将先运行,但并不保证这一点。

    四、用法

      一般的用法如上述的示例即等待-通知机制,套路如下:

      1、Thread1中判断某一条件不成立while(!condition),然后调用wait()方法。

      2、Thread2中建立该条件如condition=true,然后调用notify()。

  • 相关阅读:
    NotFoundHttpException
    postMan
    Extjs win
    Extjs toolbar 如何添加竖杆分隔符
    Extjs iconCls 的用法
    b站Java基本语法4之进制转换
    b站Java基本语法4之基本数据类型的运算规则
    b站数据库课2之连接查询
    b站Java尚硅谷0
    b站数据库课1之分组函数分组查询
  • 原文地址:https://www.cnblogs.com/tigerhsu/p/10857000.html
Copyright © 2011-2022 走看看