在java中,如何在多个`条件`上等待,直到它们中的任何一个被发出信号

时间:2011-02-25 13:26:12

标签: java multithreading

假设一个电梯模拟程序,即将乘坐的游客要等到任何一个电梯门打开。即我想等多个Conditions,直到任何一个发出信号为止。

实际上,它不一定是Conditions,其他可以满足我需求的方法是受欢迎的。

如何在Java中完成?

4 个答案:

答案 0 :(得分:7)

您可能会发现CountDownLatch完成了您需要的工作。您将使用计数1来实例化锁存器:

CountDownLatch latch = new CountDownLatch(1);

然后在你的线程之间共享它。所有等待门打开的线程都会latch.await()。在另一个线程调用latch.countDown()之前,此方法不会返回。

答案 1 :(得分:5)

您可能需要查看ObserverObservable。您仍然需要处理踩踏问题但是使用Observer,您至少可以让模拟器知道何时打开门(触发事件)

答案 2 :(得分:1)

而不是一组条件,我使用BlockingQueue<Door>,(Door是电梯门的枚举),其中线程想要使用门电话{{1}在队列中,以及打开门禁take()的线程。然后使用put(Door.ONE)移除任何其他打开的门(可能是有另一种机制告诉门开口螺纹,电梯已经离开,并且他们无法再打开门)。

答案 3 :(得分:1)

一般来说,Lock保护共享状态,Condition用于等待该状态的特定条件。

但在您的任务中,您实际上有两组正交状态 - 电梯状态和楼层状态。这意味着如果要使用Lock / Condition原语来处理此任务,则需要为这些状态创建单独的锁和条件。

也就是说,当电梯到达楼层时,它获得其自己的锁和地板锁,然后发信号通知与楼层相关的条件,以便唤醒在地板上等待的访客。还要注意锁定顺序以避免此方案中的死锁。