假设一个电梯模拟程序,即将乘坐的游客要等到任何一个电梯门打开。即我想等多个Conditions
,直到任何一个发出信号为止。
实际上,它不一定是Conditions
,其他可以满足我需求的方法是受欢迎的。
如何在Java中完成?
答案 0 :(得分:7)
您可能会发现CountDownLatch完成了您需要的工作。您将使用计数1来实例化锁存器:
CountDownLatch latch = new CountDownLatch(1);
然后在你的线程之间共享它。所有等待门打开的线程都会latch.await()
。在另一个线程调用latch.countDown()
之前,此方法不会返回。
答案 1 :(得分:5)
您可能需要查看Observer和Observable。您仍然需要处理踩踏问题但是使用Observer,您至少可以让模拟器知道何时打开门(触发事件)
答案 2 :(得分:1)
而不是一组条件,我使用BlockingQueue<Door>
,(Door
是电梯门的枚举),其中线程想要使用门电话{{1}在队列中,以及打开门禁take()
的线程。然后使用put(Door.ONE)
移除任何其他打开的门(可能是有另一种机制告诉门开口螺纹,电梯已经离开,并且他们无法再打开门)。
答案 3 :(得分:1)
一般来说,Lock
保护共享状态,Condition
用于等待该状态的特定条件。
但在您的任务中,您实际上有两组正交状态 - 电梯状态和楼层状态。这意味着如果要使用Lock
/ Condition
原语来处理此任务,则需要为这些状态创建单独的锁和条件。