感觉java中的wait函数和C++中的和WaitForSingleObject函数类似,但是,怎么判断waitwait是超时返回还是其他线程通知返回的呢?注:WaitForSingleObject是通过返回值确定的。

解决方案 »

  1.   

    java的wait 是把当前线程的互斥锁释放掉,然后把自己推进等待池(从运行态转为阻塞态),一般会配合
    notify用,
    一般都是notify在前面,因为notify是先唤醒那些在等待池的线程,让他们进入锁池去等待锁(也就是说让这些线程从阻塞态转为就绪态),一旦有线程调用了wait释放了锁,那些在锁池的线程就可以运行了
      

  2.   

    一般对象都有3个wait的重载函数
     void wait() 
              导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。 
     void wait(long timeout) 
              导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。 
     void wait(long timeout, int nanos) 
              导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。 
      

  3.   

    请参考j2seapi:
    wait
    public final void wait(long timeout,
                           int nanos)
                    throws InterruptedException导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。 
    此方法类似于一个参数的 wait 方法,但它允许更好地控制在放弃之前等待通知的时间量。用毫微秒度量的实际时间量可以通过以下公式计算出来: 1000000*timeout+nanos在其他所有方面,此方法执行的操作与带有一个参数的 wait(long) 方法相同。需要特别指出的是,wait(0, 0) 与 wait(0) 相同。 当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权,并等待下面两个条件之一发生: 其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。 
    timeout 毫秒值与 nanos 毫微秒参数值之和指定的超时时间已用完。 
    然后,该线程等到重新获得对监视器的所有权后才能继续执行。 对于某一个参数的版本,实现中断和虚假唤醒是有可能的,并且此方法应始终在循环中使用: synchronized (obj) {
    while (<condition does not hold>)
    obj.wait(timeout, nanos);
    ... // Perform action appropriate to condition
         }
     此方法只应由作为此对象监视器的所有者的线程来调用。请参阅 notify 方法,了解线程能够成为监视器所有者的方法的描述。 参数:
    timeout - 要等待的最长时间(以毫秒为单位)。
    nanos - 额外时间(以毫微秒为单位,范围是 0-999999)。 
      

  4.   

    定义一个全局变量比如Boolean flag=true;
    在需要同步的块中这样定义
       flag=true;
       wait(long timeout);
       if(falg){
        // 这是超时返回的
       }
       else{
       // 这是线程调用返回的
       }  其他线程调用完了都要把全局变量flag设置为false;
    这样原线程就知道是谁调用,还是超时返回的了
      

  5.   

    够老的问题  
    long start = System.currentTimeMillis ();
    long waitTime = timeout;
    wait (waitTime); 
    long now = System.currentTimeMillis ();
    long timeSoFar = now - start; //计算已经等待的时间
    if (timeSoFar >= msecTimeout)  // 如果超时,抛出TimeoutException异常
                  throw new TimeoutException ();