当前位置: 首页 > 面试题库 >

条件与等待通知机制

苏品
2023-03-14
问题内容

与传统的等待通知机制相比,使用Condition接口/实现的优点是什么?在这里,我引用道格·李(Doug Lea)的评论:

条件将对象监视方法(wait,notify和notifyAll)分解为不同的对象,从而通过与任意Lock实现结合使用,从而使每个对象具有多个等待集。如果Lock替换了同步方法和语句的使用,而Condition替换了Object监视器方法的使用。

我看到这是实现等待/通知机制的一种更面向对象的方式。但是,相对于前者,有什么优势吗?


问题答案:

如上所述,关于 条件接口* 有许多 优点 ,一些重要的如下: *

条件接口 附带 两个 额外的 方法

1)布尔值awaitUntil(日期期限)抛出InterruptedException: 导致当前线程等待,直到发出信号或被中断或指定的期限过去。

2)awaitUninterruptible(): 使当前线程等待,直到发出信号为止。

如果当前线程进入此方法时已设置其中断状态,或者在等待时被中断,它将继续等待直到发出信号。当它最终从该方法返回时,其中断状态仍将被设置。

以上两种方法在对象类的默认监视器中不存在,在某些情况下,我们希望设置线程等待的截止日期,然后我们可以通过Condition接口来实现。

在某些情况下,我们不希望线程被中断,而希望当前线程等待,直到收到信号为止,然后我们可以使用条件接口中存在的awaitUninterruptible方法。

有关更多信息,条件接口Java文档:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Condition.html#awaitUntil%28java.util.Date%29



 类似资料:
  • 我第一次做硒测试。在主页上,我调用了一些AJAX,我希望Selenium等待元素加载完成。我不确定它是否有效,但我只是键入selenium,waitForCondition可以选择。 无论我选择什么,它总是返回“false”。我现在连等待条件都不工作吗? 我如何测试它是否有效?在这些代码中我做错了什么? 如果由自己的类实现,则返回“true” isElementPresent(By.xpath(“

  • 因为这是我的第一篇文章,所以我为它的结构上的任何错误道歉。我正在做一个个人项目,这是一个用java制作的时钟,可以显示时间/日期/日期,每季度播放一个音频文件,以及报时。图形用户界面是用摆动项构建的。 当时钟到达一定时间时,它必须发出钟声/播放声音,我希望在时钟响起时在GUI上显示一个图标。此时,图标在方法的开头切换,在方法的结尾再次切换。在第二次切换图标之前,我希望方法在播放音频时等待()。(也

  • 我不完全理解和()是如何工作的,因此我不得不将尝试缩减到以下代码部分。 main.java: runner.java: 当前,我在调用时得到一个非法MonitorStateException,但我不明白为什么。从我所看到的情况来看,我需要同步,但在这样做的时候,我假设它只会通知一个线程,而我的想法是通知所有线程。 我已经查看了,但是我找不到合适的替换(也许我只是遗漏了一些东西)。

  • 问题内容: 如果我仅使用同步而不是等待/通知方法,它将仍然保持线程安全吗? 有什么不同 ? 提前谢谢。 问题答案: 使用使方法/块一次只能在线程上访问。因此,是的,它是线程安全的。 这两个概念是结合在一起的,而不是相互排斥的。使用时,您需要在该对象上拥有监视器。所以您需要在此之前。使用使当前线程停止,直到另一个线程在其等待的对象上调用。这是对的补充,它仅确保仅一个线程将进入块/方法。

  • 问题内容: 我刚开始学习Kubernetes。我已经通过Kubernetes YUM存储库安装了带有SELinux禁用的kubectl,kubeadm和kubelet的CentOS 7.5。 但是,当我要启动命令时。我收到此错误消息: 根据Linux Foundation课程,我不需要执行更多命令即可将第一个启动集群创建到VM中。 错误? Firewalld确实有进入防火墙的开放端口。6443 /

  • 主要内容:1 Condition概述,1.1 Object监视器与Condition,1.2 常用API方和使用示例,2 条件队列的结构,3 等待机制原理,3.1 await()响应中断等待,3.2 await(time TimeUnit)超时等待一段时间,3.3 awaitUntil(deadline)超时等待时间点,3.4 awaitNanos(nanosTimeout) 超时等待纳秒,3.5 awaitUninterruptibly()不响应中断等待,,,,,,,,详细介绍了AQS中的条件