zoukankan      html  css  js  c++  java
  • java线程学习之wait方法

    wait 等待方法是让线程进入等待队列,使用方法是 obj.wait(); 这样当前线程就会暂停运行,并且进入obj的等待队列中,称作“线程正在obj上等待”。

    如果线程想执行 wait 方法,线程必须拥有锁。如果线程进入等待队列,就会释放其实例的锁。

    有两种形式的wait方法

       一种是:接受毫秒数作为参数,含义与sleep中方法里接受参数的意思相同,都是指“在此期间暂停”,但是与sleep方法不同的是,wait 在暂停等待期间,对象锁是释放的,而sleep是拥抱着这把锁;还有一点不同的是,wait方法可以通过notify,notifyAll或者等待的时间到期,都可以令此线程接着执行。(时间参数值必须大于0,如果小于0,则会抛出 IllegalArgumentException运行异常,如果时间参数为0 ,则会一直等待下去)

                           在接收参数的wait方法中,有两种分别是:

              public final void wait(long timeout) throws InterruptedException
              public final void wait(long timeout,int nanos)throws InterruptedException
     1  public final void wait(long timeout, int nanos) throws InterruptedException {
     2         if (timeout < 0) {
     3             throw new IllegalArgumentException("timeout value is negative");
     4         }
     5 
     6         if (nanos < 0 || nanos > 999999) {
     7             throw new IllegalArgumentException(
     8                                 "nanosecond timeout value out of range");
     9         }
    10 
    11         if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
    12             timeout++;
    13         }
    14 
    15         wait(timeout);
    16     }
    wait(long timeout, int nanos)在Object中的显示

    另一种是:wait 方法不接受任何参数,这种wait(),将无限等待下去,直到线程接收到nofity或者notifyAll的通知信息,才能继续执行。

    摘自JDK 的API:

    在没有被通知、中断或超时的情况下,线程还可以唤醒一个所谓的虚假唤醒 (spurious wakeup)。虽然这种情况在实践中很少发生,但是应用程序必须通过以下方式防止其发生,即对应该导致该线程被提醒的条件进行测试,如果不满足该条件,则继续等待。换句话说,等待应总是发生在循环中,如下面的示例:

    synchronized (obj) {
    while (<condition does not hold>)
    obj.wait(timeout);
    ... // Perform action appropriate to condition
         }
     

    如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态 被清除,就会抛出中断异常InterruptedException

    生于忧患,死于安乐
  • 相关阅读:
    通过w3c方式 读取xml内容
    ssm项目 maven 项目pon.xml 配置
    myeclipse 2014新建maven web 项目步骤
    Maven学习
    常用正则学习
    Maven 那点事儿
    Chrome 里的请求报错 " Provisional headers are shown"
    php框架thinkphp3.2.3 配置文件bug
    $_GET $_POST $_REQUEST
    php检测函数
  • 原文地址:https://www.cnblogs.com/songlove/p/10628679.html
Copyright © 2011-2022 走看看