जैसा कि कोई जवाब नहीं है स्वीकृत उत्तर के रूप में, मैंने लाइव लॉक उदाहरण बनाने का प्रयास किया है;
मल्टीथ्रेडिंग की विभिन्न अवधारणा को सीखने के लिए अप्रैल 2012 में मेरे द्वारा मूल कार्यक्रम लिखा गया था। इस बार मैंने इसे गतिरोध, दौड़ की स्थिति, लाइवलॉक आदि बनाने के लिए संशोधित किया है।
तो आइए पहले समस्या कथन को समझते हैं;
कुकी निर्माता समस्या
कुछ घटक कंटेनर हैं: चोकोपेडरकेनटेनर , व्हीटपाउडरकॉनटेनर । कुकीमेकर कुकी को बेक करने के लिए घटक कंटेनरों से कुछ मात्रा में पाउडर लेता है । अगर कुकी बनाने वाला एक कंटेनर खाली पाता है तो वह समय बचाने के लिए दूसरे कंटेनर की जांच करता है। और जब तक भराव आवश्यक कंटेनर भरता है तब तक इंतजार करता है । एक भराव है जो नियमित अंतराल पर कंटेनर की जांच करता है और कुछ मात्रा को भरता है यदि कंटेनर को इसकी आवश्यकता होती है।
कृपया गीथूब पर पूरा कोड जांचें ;
मैं आपको संक्षेप में कार्यान्वयन के बारे में बताता हूं।
- मैं फिलर को डेमन थ्रेड के रूप में शुरू करता हूं । इसलिए यह नियमित अंतराल पर कंटेनर भरता रहेगा। एक कंटेनर को भरने के लिए सबसे पहले यह कंटेनर को बंद कर देता है -> जांचें कि क्या उसे कुछ पाउडर की जरूरत है -> इसे भरता है -> सभी निर्माताओं को संकेत दें जो इसके लिए इंतजार कर रहे हैं -> कंटेनर को अनलॉक करें।
- मैं कुकीमेकर बनाता हूं और सेट करता हूं कि यह समानांतर में 8 कुकीज़ तक सेंकना कर सकता है। और मैं कुकीज़ को सेंकना करने के लिए 8 धागे शुरू करता हूं।
- प्रत्येक निर्माता धागा कंटेनरों से पाउडर लेने के लिए 2 कॉल करने योग्य उप-धागा बनाता है।
- उप-धागा एक कंटेनर पर ताला लगाता है और जांचता है कि क्या उसके पास पर्याप्त पाउडर है। यदि नहीं, तो कुछ समय प्रतीक्षा करें। एक बार फिलर कंटेनर को भर देता है, यह पाउडर लेता है, और कंटेनर को अनलॉक करता है।
- अब यह अन्य गतिविधियों को पूरा करता है जैसे: मिश्रण बनाना और पकाना आदि।
आइए कोड में एक नज़र डालें:
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;
}
जब तक सब कुछ ठीक चलता है भराव कंटेनर भरने है। लेकिन अगर मैं भराव शुरू करना भूल जाता हूं, या भराव अप्रत्याशित छुट्टी पर चला जाता है, तो उप-थ्रेड अपने राज्यों को बदलते रहते हैं ताकि अन्य निर्माता को कंटेनर की जांच करने की अनुमति मिल सके।
मैंने एक डेमन थ्रेडट्रैसर भी बनाया है जो थ्रेड स्टेट्स और डेडलॉक पर नजर रखता है। यह कंसोल से आउटपुट;
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]
आप देखेंगे कि उप-सूत्र और उनके राज्य बदल रहे हैं और प्रतीक्षा कर रहे हैं।