2011-02-25 30 views
7

Bir asansör simülasyon programı varsayalım, gezmeye gelen ziyaretçilerin asansör kapılarının herhangi birini açmasını beklemek gerekir. Yani, herhangi biri işaretlenene kadar birden fazla Conditions beklemek istiyorum.Javada, bunlardan biri sinyal verilinceye kadar çoklu `Koşullar 'beklemek nasıl

Aslında, Conditions olmak zorunda değil, ihtiyacım olan diğer yaklaşımlar karşılanabilir.

Bu, Java'da nasıl yapılabilir?

+1

Açıkladığınız şey aslında bir sıra. Bazı BlockingQueue kullanın ve bitmiş görevi buraya yerleştirin. – bestsss

+0

@bestess Haklısınız! Ancak, yorum yaptınız ama cevap vermediniz. Böylece şimdiye kadar fark etmedim. Ne yazık. Ama yine de teşekkürler. – Haozhun

cevap

6

Gereksinim duyduğunuz işi CountDownLatch bulabilirsiniz.

CountDownLatch latch = new CountDownLatch(1); 

ve sonra konuları arasında paylaşmak: Eğer 1 sayısı ile beraber mandalı örneğini olacaktır. Kapıların açılmasını bekleyen tüm dişler latch.await() yapacaktır. Başka bir iş parçacığı latch.countDown() çağırıncaya kadar bu yöntem geri dönmez.

+0

Görünüşe göre 'CountDownLatch' tekrarlanan sürümü 'CyclicBarrier' gibi görünüyor. Çok teşekkürler! – Haozhun

5

Observer ve Observable ürününü incelemek isteyebilirsiniz. Treading sorunlarını işlemek zorunda kalacaksınız ancak Observer ile en azından simülatörün bir kapının ne zaman açılacağını (bir olayı tetiklediğini) bilmenin kolay bir yolunu bulacaksınız (bir olayı tetikler)

+0

Herhangi bir sayıda olay iş parçacığınızın beklediği Koşulları tetikleyebilir. yani herhangi birLiftAvailable durumu. –

+0

Teşekkürler. Çözümün iş yapıyor! Ancak bu yaklaşım, işlerin yapılma şeklini tamamen tersine çevirir. Başka bir çözüm mümkün olmadığı sürece bunu denemeyeceğim. – Haozhun

1

Bir dizi koşul yerine, bir BlockingQueue<Door> kullanın. (Door, asansördeki kapıların bir enumudur), kapı üzerinde take() kapı aramasını kullanmak isteyen iş parçacıkları ve kapı aramasını put(Door.ONE) açıyor. ve sonra diğer açık kapıları kaldırmak için drainTo'u kullanır (muhtemelen, asansörün bıraktığı kapı açma dişlilerini anlatacak ve daha fazla kapı açamayacak başka bir mekanizma vardır).

1

Genel olarak, Lock, paylaşılan durumu korur ve Condition, bu durumda belirli bir durumu beklemek için kullanılır. Ancak görevinizde aslında iki takım ortogonal durumunuz var: asansörler ve kat halleri. Bu görevle çalışmak için Lock/ temel öğelerini kullanmak isterseniz, bu durumlar için ayrı kilitler ve koşullar oluşturmanız gerekir. Yani, asansör zemine geldiğinde, kendi kilidini ve zemini kilitledikten sonra zemine bağlı bir durumu işaret eder, böylece zeminde bekleyen ziyaretçilerin uyanması sağlanır. Ayrıca, bu şemadaki kilitlenmeleri önlemek için kilit sırasına dikkat edin.

+0

Zengin çözüm gibi hissediyorum. Sence bu benim işim mi? – Haozhun

İlgili konular