DelayQueue का वास्तविक विश्व उपयोग क्या होगा , इसे हल करने के लिए कौन सी सामान्य समस्या थी?
DelayQueue का वास्तविक विश्व उपयोग क्या होगा , इसे हल करने के लिए कौन सी सामान्य समस्या थी?
जवाबों:
मैंने हाल ही में दर सीमित करने के लिए एक देरी कतार का उपयोग किया।
प्रति सेकंड X ईवेंट की एक सीमा के लिए, प्रत्येक ईवेंट को 1 सेकंड की देरी के साथ विलंब कतार में रखें।
यदि विलंब क्यू पर एक्स इवेंट हैं, तो कतार से ले () जो (कम से कम 1 समाप्ति तक ब्लॉक)। इस तरह आप किसी भी लंबी अवधि की सीमा को पार किए बिना, एक छोटी अवधि के फटने की अनुमति देते हैं।
यह वर्ग एक थ्रेड के लिए एकदम सही है जो कई विलंबित घटनाओं को उनके उचित क्रम में संसाधित करना चाहता है।
मान लीजिए, उदाहरण के लिए, आपके पास 100 चमकती रोशनी के साथ एक डिस्प्ले है, और सभी रोशनी अलग-अलग असंबंधित दरों पर चमकती हैं। आपके पास प्रत्येक प्रकाश के लिए एक धागा हो सकता है, या आप इस कक्षा का उपयोग करके उन सभी को एक धागा समन्वयित कर सकते हैं। यह कुछ इस तरह काम करेगा:
Light
एक फ्लैश दर के साथ एक वर्ग हैDelayed
इंटरफ़ेस के कार्यान्वयन को बनाएं जो प्रकाश को इंगित करता है, कहते हैंLightFlash
DelayQueue
और LightFlash
प्रत्येक प्रकाश के लिए एक नया जोड़ दें, जिससे प्रकाश की फ्लैश दर के लिए उपयुक्त सेट होDelayQueue अगली घटना को संसाधित करने के लिए ध्यान रखता है।
दो वास्तविक दुनिया के उदाहरण जो मैं सोच सकता हूं:
DelayQueue
शायद एक प्राथमिकता कतार के रूप में लागू किया जाता है , जो आमतौर पर ढेर के रूप में सबसे अच्छा कार्यान्वित किया जाता है ।
मुख्य उपयोग टाइमर कक्षाओं के लिए टास्क टाइमर्स की तरह होगा
अगर कोई सिस्टम क्लॉक से विलंबित इंडिपेंडेंट बना सकता है (जो मैं आपको ध्यान रख सकता हूं, हालांकि यह सुनिश्चित नहीं है) आप इसे "5 टिक के बाद एक्स" (जैसे घड़ी घबराना वॉल्ड इस अविश्वसनीय बना सकते हैं) जैसे गेम इवेंट के लिए उपयोग कर सकते हैं
ध्यान दें कि देरी उन तत्वों से जुड़ी होती है जो कतार पर जाने के बजाय कतार में जाते हैं। कतार में जाने वाली कुछ वस्तुओं में शून्य की देरी हो सकती है, जबकि कुछ में अधिक देर हो सकती है:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html
इसे ध्यान में रखते हुए, मैं कुछ उपयोग के मामलों के बारे में सोच सकता हूं - हालांकि वे शायद आपके मैसेजिंग प्रवाह के संबंध में नाजुक और कोड गंध वाले होंगे। मैं विशिष्ट परिस्थितियों को छोड़कर उन सभी के लिए विकल्पों का उपयोग करूंगा:
1) नियंत्रण प्रवाह - हम जानते हैं कि एक ऑर्डर को प्रोसेस होने में 60 सेकंड लगते हैं, इसलिए कतार का अगला ऑर्डर तब तक न पढ़ें जब तक कि ऑब्जेक्ट कम से कम 60 सेकंड के लिए न हो।
2) संदेश प्रवाह - एक अत्यधिक अतुल्यकालिक प्रणाली जहां हम 2 या 3 बाहरी सेवाओं के लिए अनुरोध भेजते हैं और फिर अगले एन को संसाधित करने के लिए अगला कार्य जारी करते हैं, एक बार जब हम जानते हैं कि नौकरियों का पहला बैच कम से कम पूरा होने का मौका है ।
3) संदेश बैचिंग - शायद एक निश्चित प्रकार के आदेश फट रहे हैं, इसलिए अंतिम एन सेकंड में प्राप्त आदेशों को संसाधित करने की अनुमति नहीं देता है इसलिए हम देख सकते हैं कि क्या समान आदेश कुछ ही समय बाद आते हैं जो अगले रन पर एक बैच के रूप में संसाधित हो सकते हैं।
4) संदेश प्राथमिकताएं - विभिन्न संदेश या विभिन्न ग्राहक कम या शून्य देरी के साथ सेवा की थोड़ी उच्च गुणवत्ता प्राप्त कर सकते थे।
कुछ मामलों में, जिन वस्तुओं को आप कतार में रखते हैं, वे उस कतार में एक निश्चित समय के लिए होनी चाहिए, जब वे पहले से तैयार हों। यह वह जगह है जहाँ आप java.util.concurrent.DelayQueue क्लास का उपयोग करते हैं, जो ब्लॉकिंग क्यू इंटरफ़ेस को लागू करता है। DelayQueue की आवश्यकता होती है कि कतार ऑब्जेक्ट्स निर्दिष्ट समय के लिए कतार में निवासी हो।
वास्तविक दुनिया के उपयोग के उदाहरण के लिए डेक्स साइट पर कतारबद्ध लेख को देखें
... वास्तविक दुनिया का उदाहरण है कि मैंने इसे स्पष्ट करने के लिए सोचा था (जो आपको भूखा कर सकता है) में मफिन शामिल है। अच्छी तरह से, मफिन ऑब्जेक्ट्स (जैसा कि हम जावा से बात कर रहे हैं - कोई कॉफी का इरादा नहीं)। मान लीजिए कि आपके पास एक DelayQueue है जिस पर आप मफिन ऑब्जेक्ट्स को रखते हैं ... गेटडेल विधि, संक्षेप में, बताती है कि ऑब्जेक्ट को DelayQueue में रखने के लिए कितना समय बचा है। जब इस विधि द्वारा दी गई संख्या शून्य या शून्य से कम हो जाती है, तो वस्तु तैयार होती है (या इस उदाहरण में, बेक्ड) और उसे समाप्त करने की अनुमति दी जाती है ...
चूंकि आप वास्तव में एक मफिन नहीं खाना चाहते हैं, जो पूरी तरह से पकाया नहीं जाता है, सिफारिश किए गए खाना पकाने के समय के लिए मफिन को DelayQueue पर रखें ...