Kabul edilen cevap olarak işaretlenmiş bir cevap olmadığından, canlı kilit örneği oluşturmaya çalıştım;
Özgün program , çeşitli çoklu kullanım kavramlarını öğrenmek için Nisan 2012'de yazdı. Bu sefer kilitlenme, yarış durumu, canlı kilit vb.
Önce sorun ifadesini anlayalım;
Çerez Oluşturma Sorunu
Bazı içerik kapları vardır: ChocoPowederContainer , WheatPowderContainer . CookieMaker bir Cookie pişirmek için bileşen kaplarından bir miktar toz alır . Bir çerez üreticisi bir kap boş bulursa, zaman kazanmak için başka bir kap olup olmadığını kontrol eder. Ve Filler gerekli kabı doldurana kadar bekler . Konteyneri düzenli aralıklarla kontrol eden ve bir konteynere ihtiyacı varsa bir miktar dolduran bir Dolgu vardır .
Lütfen github'daki kodun tamamını kontrol edin ;
Kısaca uygulamanızı açıklayayım.
- Filler'i daemon thread olarak başlatıyorum . Böylece konteynırları düzenli aralıklarla doldurmaya devam edecektir. Bir konteyneri doldurmak için önce konteyneri kilitler -> biraz toz gerekip gerekmediğini kontrol edin -> doldurur -> bekleyen tüm üreticilere sinyal verin -> konteynerin kilidini açın.
- CookieMaker oluşturdum ve paralel olarak en fazla 8 çerez pişirebileceğini ayarladım. Ve kurabiye pişirmek için 8 konu başlıyorum.
- Her üretici ipliği, kaplardan toz almak için 2 çağrılabilir alt iplik oluşturur.
- alt iplik kabı kilitler ve yeterli toz olup olmadığını kontrol eder. Değilse, bir süre bekleyin. Dolgu kabı doldurduktan sonra tozu alır ve kabın kilidini açar.
- Şimdi karışım ve fırın gibi diğer faaliyetleri tamamlıyor.
Kodda bir göz atalım:
CookieMaker.java
private Integer getMaterial(final Ingredient ingredient) throws Exception{
:
container.lock();
while (!container.getIngredient(quantity)) {
container.empty.await(1000, TimeUnit.MILLISECONDS);
//Thread.sleep(500); //For deadlock
}
container.unlock();
:
}
IngredientContainer.java
public boolean getIngredient(int n) throws Exception {
:
lock();
if (quantityHeld >= n) {
TimeUnit.SECONDS.sleep(2);
quantityHeld -= n;
unlock();
return true;
}
unlock();
return false;
}
Filler kapları doldurana kadar her şey yolunda gider . Ancak dolguyu başlatmayı unutursam veya dolgu beklenmedik bir izin verirse, alt iplikler diğer üreticinin gidip konteyneri kontrol etmesine izin vermek için durumlarını değiştirmeye devam eder.
Ayrıca iş parçacığı durumları ve kilitlenmeleri izleyen bir daemon ThreadTracer oluşturduk. Bu konsoldan çıktı;
2016-09-12 21:31:45.065 :: [Maker_0:WAITING, Maker_1:WAITING, Maker_2:WAITING, Maker_3:WAITING, Maker_4:WAITING, Maker_5:WAITING, Maker_6:WAITING, Maker_7:WAITING, pool-7-thread-1:TIMED_WAITING, pool-7-thread-2:TIMED_WAITING, pool-8-thread-1:TIMED_WAITING, pool-8-thread-2:TIMED_WAITING, pool-6-thread-1:TIMED_WAITING, pool-6-thread-2:TIMED_WAITING, pool-5-thread-1:TIMED_WAITING, pool-5-thread-2:TIMED_WAITING, pool-1-thread-1:TIMED_WAITING, pool-3-thread-1:TIMED_WAITING, pool-2-thread-1:TIMED_WAITING, pool-1-thread-2:TIMED_WAITING, pool-4-thread-1:TIMED_WAITING, pool-4-thread-2:RUNNABLE, pool-3-thread-2:TIMED_WAITING, pool-2-thread-2:TIMED_WAITING]
2016-09-12 21:31:45.065 :: [Maker_0:WAITING, Maker_1:WAITING, Maker_2:WAITING, Maker_3:WAITING, Maker_4:WAITING, Maker_5:WAITING, Maker_6:WAITING, Maker_7:WAITING, pool-7-thread-1:TIMED_WAITING, pool-7-thread-2:TIMED_WAITING, pool-8-thread-1:TIMED_WAITING, pool-8-thread-2:TIMED_WAITING, pool-6-thread-1:TIMED_WAITING, pool-6-thread-2:TIMED_WAITING, pool-5-thread-1:TIMED_WAITING, pool-5-thread-2:TIMED_WAITING, pool-1-thread-1:TIMED_WAITING, pool-3-thread-1:TIMED_WAITING, pool-2-thread-1:TIMED_WAITING, pool-1-thread-2:TIMED_WAITING, pool-4-thread-1:TIMED_WAITING, pool-4-thread-2:TIMED_WAITING, pool-3-thread-2:TIMED_WAITING, pool-2-thread-2:TIMED_WAITING]
WheatPowder Container has 0 only.
2016-09-12 21:31:45.082 :: [Maker_0:WAITING, Maker_1:WAITING, Maker_2:WAITING, Maker_3:WAITING, Maker_4:WAITING, Maker_5:WAITING, Maker_6:WAITING, Maker_7:WAITING, pool-7-thread-1:TIMED_WAITING, pool-7-thread-2:TIMED_WAITING, pool-8-thread-1:TIMED_WAITING, pool-8-thread-2:TIMED_WAITING, pool-6-thread-1:TIMED_WAITING, pool-6-thread-2:TIMED_WAITING, pool-5-thread-1:TIMED_WAITING, pool-5-thread-2:TIMED_WAITING, pool-1-thread-1:TIMED_WAITING, pool-3-thread-1:TIMED_WAITING, pool-2-thread-1:TIMED_WAITING, pool-1-thread-2:TIMED_WAITING, pool-4-thread-1:TIMED_WAITING, pool-4-thread-2:TIMED_WAITING, pool-3-thread-2:TIMED_WAITING, pool-2-thread-2:RUNNABLE]
2016-09-12 21:31:45.082 :: [Maker_0:WAITING, Maker_1:WAITING, Maker_2:WAITING, Maker_3:WAITING, Maker_4:WAITING, Maker_5:WAITING, Maker_6:WAITING, Maker_7:WAITING, pool-7-thread-1:TIMED_WAITING, pool-7-thread-2:TIMED_WAITING, pool-8-thread-1:TIMED_WAITING, pool-8-thread-2:TIMED_WAITING, pool-6-thread-1:TIMED_WAITING, pool-6-thread-2:TIMED_WAITING, pool-5-thread-1:TIMED_WAITING, pool-5-thread-2:TIMED_WAITING, pool-1-thread-1:TIMED_WAITING, pool-3-thread-1:TIMED_WAITING, pool-2-thread-1:TIMED_WAITING, pool-1-thread-2:TIMED_WAITING, pool-4-thread-1:TIMED_WAITING, pool-4-thread-2:TIMED_WAITING, pool-3-thread-2:TIMED_WAITING, pool-2-thread-2:TIMED_WAITING]
Alt konuları ve durumlarını değiştirip beklediğini göreceksiniz.