2011-02-25 7 views
7

Supongamos que un programa de simulación de ascensores, los visitantes a punto de dar un paseo deben esperar hasta que se abra cualquiera de las puertas del ascensor. es decir, quiero esperar en múltiples Conditions hasta que cualquiera de ellos sea señalizado.En java, cómo esperar en múltiples `Condiciones` hasta que se indique cualquiera de ellas

En realidad, no tiene que ser Conditions, otros enfoques que pueden satisfacer mi necesidad son bienvenidos.

¿Cómo se puede hacer esto en Java?

+1

Lo que describes es en realidad una cola. Usa un poco de BlockingQueue y pon la tarea terminada allí. – bestsss

+0

@bestess ¡Tienes razón! Sin embargo, usted comentó pero no respondió. Para que no me haya dado cuenta hasta ahora. Qué pena. Pero gracias de todas maneras. – Haozhun

Respuesta

6

Puede encontrar que CountDownLatch hace el trabajo que necesita. Se podría crear una instancia del pestillo con un recuento de 1:

CountDownLatch latch = new CountDownLatch(1); 

y luego compartirlo entre sus hilos. Todos los hilos que esperan a que se abran las puertas harán latch.await(). Este método no volverá hasta que otro hilo llame al latch.countDown().

+0

Parece que 'CyclicBarrier', la versión repetida de' CountDownLatch', es lo que estoy buscando. ¡Muchas gracias! – Haozhun

5

Es posible que desee comprobar Observer y Observable. Todavía tendrá que manejar los problemas de pisada, pero con Observer al menos tiene una manera fácil para que el simulador sepa cuándo se abre una puerta (desencadena un evento)

+0

Cualquier cantidad de eventos puede desencadenar la condición que su subproceso está esperando. es decir, la condición anyLiftAvailable. –

+0

Gracias. ¡Tu solución hace el trabajo! Pero este enfoque revierte por completo la forma en que se hacen las cosas. No intentaré esto a menos que no sea posible otra solución. – Haozhun

1

En lugar de un conjunto de condiciones, usaría un BlockingQueue<Door>, (Door es una enumeración de las puertas en el ascensor) donde los hilos que desean usar una puerta llaman a take() en la cola, y los hilos que están abriendo una puerta llaman al put(Door.ONE). y luego usa drainTo para quitar cualquier otra puerta abierta (presumiblemente hay otro mecanismo para indicar a los hilos de apertura de la puerta que el elevador ha dejado y que no pueden abrir más puertas).

1

En general, Lock protege el estado compartido y Condition se usa para esperar una condición particular en ese estado.

Pero en su tarea, en realidad tiene dos conjuntos de estados ortogonales: estados de los ascensores y estados de los pisos. Significa que si desea utilizar primitivas Lock/Condition para trabajar con esta tarea, debe crear bloqueos y condiciones independientes para estos estados.

Es decir, cuando el ascensor llega al piso, adquiere su propio candado y un candado del piso, y luego señala una condición asociada con el piso, de modo que los visitantes que esperan en el piso se despiertan. También preste atención al orden de bloqueo para evitar interbloqueos en este esquema.

+0

Me siento como la solución de Rich. ¿Crees que eso hace mi trabajo? – Haozhun

Cuestiones relacionadas