我怎么知道wait是超时返回还是其他线程通知返回?

niefuhua 2009-10-31 04:55:06
感觉java中的wait函数和C++中的和WaitForSingleObject函数类似,但是,怎么判断waitwait是超时返回还是其他线程通知返回的呢?

注:WaitForSingleObject是通过返回值确定的。
...全文
762 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
大龄代码农民 2011-12-13
  • 打赏
  • 举报
回复
够老的问题
long start = System.currentTimeMillis ();
long waitTime = timeout;
wait (waitTime);
long now = System.currentTimeMillis ();
long timeSoFar = now - start; //计算已经等待的时间
if (timeSoFar >= msecTimeout) // 如果超时,抛出TimeoutException异常
throw new TimeoutException ();
dajiadebeibei9 2009-10-31
  • 打赏
  • 举报
回复
有道理
r4141496091 2009-10-31
  • 打赏
  • 举报
回复
定义一个全局变量比如Boolean flag=true;


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


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





其他线程调用完了都要把全局变量flag设置为false;
这样原线程就知道是谁调用,还是超时返回的了


r4141496091 2009-10-31
  • 打赏
  • 举报
回复
这样也可以
loveofmylife 2009-10-31
  • 打赏
  • 举报
回复
应该不可以
r4141496091 2009-10-31
  • 打赏
  • 举报
回复
请参考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)。
r4141496091 2009-10-31
  • 打赏
  • 举报
回复
一般对象都有3个wait的重载函数
void wait()
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
void wait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
void wait(long timeout, int nanos)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
r4141496091 2009-10-31
  • 打赏
  • 举报
回复
java的wait 是把当前线程的互斥锁释放掉,然后把自己推进等待池(从运行态转为阻塞态),一般会配合
notify用,
一般都是notify在前面,因为notify是先唤醒那些在等待池的线程,让他们进入锁池去等待锁(也就是说让这些线程从阻塞态转为就绪态),一旦有线程调用了wait释放了锁,那些在锁池的线程就可以运行了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧