日期:2014-05-20  浏览次数:20726 次

我怎么知道wait是超时返回还是其他线程通知返回?
感觉java中的wait函数和C++中的和WaitForSingleObject函数类似,但是,怎么判断waitwait是超时返回还是其他线程通知返回的呢?

注:WaitForSingleObject是通过返回值确定的。

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

------解决方案--------------------
请参考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)。 

------解决方案--------------------
定义一个全局变量比如Boolean flag=true;


在需要同步的块中这样定义

Java code

   flag=true;
   wait(long timeout);
   if(falg){
    // 这是超时返回的
   }
   else{
   // 这是线程调用返回的
   }