够老的问题 long start = System.currentTimeMillis (); long waitTime = timeout; wait (waitTime); long now = System.currentTimeMillis (); long timeSoFar = now - start; //计算已经等待的时间 if (timeSoFar >= msecTimeout) // 如果超时,抛出TimeoutException异常 throw new TimeoutException ();
notify用,
一般都是notify在前面,因为notify是先唤醒那些在等待池的线程,让他们进入锁池去等待锁(也就是说让这些线程从阻塞态转为就绪态),一旦有线程调用了wait释放了锁,那些在锁池的线程就可以运行了
void wait()
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
void wait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
void wait(long timeout, int nanos)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
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)。
在需要同步的块中这样定义
flag=true;
wait(long timeout);
if(falg){
// 这是超时返回的
}
else{
// 这是线程调用返回的
} 其他线程调用完了都要把全局变量flag设置为false;
这样原线程就知道是谁调用,还是超时返回的了
long start = System.currentTimeMillis ();
long waitTime = timeout;
wait (waitTime);
long now = System.currentTimeMillis ();
long timeSoFar = now - start; //计算已经等待的时间
if (timeSoFar >= msecTimeout) // 如果超时,抛出TimeoutException异常
throw new TimeoutException ();