12 votes

En java, comment attendre sur plusieurs `Conditions` jusqu'à ce que l'une d'entre elles soit signalée ?

Supposons qu'un programme de simulation d'ascenseur, les visiteurs sur le point de prendre un ascenseur doivent attendre jusqu'à ce que l'une des portes de l'ascenseur s'ouvre, c'est-à-dire que je veux attendre sur plusieurs portes. Conditions jusqu'à ce que l'un d'entre eux soit signalé.

En fait, il n'est pas nécessaire que ce soit le cas Conditions Toute autre approche susceptible de répondre à mes besoins est la bienvenue.

Comment cela peut-il se faire en Java ?

8voto

Rich Points 6335

Vous pouvez trouver Verrouillage du compte à rebours fait le travail dont vous avez besoin. Vous instancierez le verrou avec un compte de 1 :

CountDownLatch latch = new CountDownLatch(1);

puis de le partager entre vos fils. Tous les threads qui attendent l'ouverture des portes feront latch.await() . Cette méthode ne sera pas renvoyée tant qu'un autre thread n'aura pas appelé latch.countDown() .

5voto

Andrew White Points 23508

Vous pouvez également consulter Observateur y Observable . Vous devrez toujours gérer les problèmes de piétinement, mais avec Observer vous avez au moins un moyen facile pour le simulateur de savoir quand une porte s'ouvre (déclenche un événement).

1voto

tgdavies Points 1916

Plutôt qu'une série de conditions, j'utiliserais un BlockingQueue<Door> , ( Door est une énumération des portes de l'ascenseur) où les threads qui veulent utiliser une porte appellent take() dans la file d'attente, et les threads qui ouvrent une porte appellent put(Door.ONE) . et utilise ensuite drainTo de supprimer toutes les autres portes ouvertes (il existe probablement un autre mécanisme pour indiquer aux fils d'ouverture des portes que l'ascenseur est parti et qu'ils ne peuvent plus ouvrir d'autres portes).

1voto

axtavt Points 126632

D'une manière générale, Lock protège l'état partagé et Condition est utilisé pour attendre une condition particulière sur cet état.

Mais dans votre tâche, vous avez en fait deux ensembles d'états orthogonaux - les états des ascenseurs et les états des étages. Cela signifie que si vous voulez utiliser Lock / Condition pour travailler avec cette tâche, vous devez créer des verrous et des conditions distincts pour ces états.

En d'autres termes, lorsque l'ascenseur arrive à l'étage, il acquiert son propre cadenas et celui de l'étage, puis signale une condition associée à l'étage, de sorte que les visiteurs qui attendent à l'étage soient réveillés. Il convient également de prêter attention à l'ordre des verrous afin d'éviter les blocages dans ce système.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X