首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何区分等待(长超时)退出通知或超时?

如何区分等待(长超时)退出通知或超时?
EN

Stack Overflow用户
提问于 2010-08-03 22:51:34
回答 7查看 32.5K关注 0票数 40

使用这个等待声明:

代码语言:javascript
复制
public final native void wait(long timeout) throws InterruptedException;

它可以通过InterruptedException退出,或者通过超时退出,或者因为Notify/NotifyAll方法是在另一个线程中调用的,所以异常很容易捕获,但是...

有没有办法知道退出的原因是超时还是通知?

编辑:

这是一种可以工作的棘手方法(尽管我不喜欢它)

代码语言:javascript
复制
          long tBefore=System.currentTimeMillis();
          wait(TIMEOUT);
          if ((System.currentTimeMillis() - tBefore) > TIMEOUT) 
            { 
               //timeout
            }
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-08-03 22:58:42

除非您提供一些额外的代码,否则您无法区分这两者。例如,通过添加仅在notify()上设置为trueThreadLocal Boolean

但首先,您必须确保您的逻辑需要这种区分。

票数 14
EN

Stack Overflow用户

发布于 2010-08-03 23:11:15

notify可以返回的另一个原因是:虚假唤醒。这不太可能,但却是可能的,因为在某些硬件/操作系统组合上,防止虚假唤醒是非常昂贵的。

因此,您必须始终在循环中调用wait(),并重新检查您正在等待的条件。在这项工作中,很容易同时检查超时。

有关详细信息,我推荐"Java并发实践“这本书。并使用更高级别的构造,这些构造将为您解决所有问题。

票数 18
EN

Stack Overflow用户

发布于 2010-08-03 23:01:04

这并没有确切地回答这个问题,但它可能会解决您的问题:使用更高级别的并发机制。等待/通知通常比您想要的更低级,这是许多其他原因中的一个原因。

例如,如果您使用的是BlockingQueue.poll(long, TimeUnit),则可以检查结果是否为null,以了解是否超时。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3397722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档