2013-01-22 14 views
5

मैं जावा में सेमफोरों की अवधारणा पर बहुत स्पष्ट नहीं हूं और इसे समझने की कोशिश कर रहा हूं।जावा में सेमफोरस और थ्रेडपूल

ऑरैकल दस्तावेज़ (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html) और कुछ अन्य पृष्ठों को पढ़ने के बाद मेरी समझ, यह एक जैसा है परमिट की संख्या की गिनती के साथ ताला लगाओ।

यह आमतौर पर संसाधनों का पूल बनाने के लिए प्रयोग किया जाता है। यहां मैं उलझन में हूं, थ्रेडपूल एक्स्सेलर भी है जो मुझे धागे का पूल दे सकता है। तो अंतर क्या है? किस परिदृश्य में किस का उपयोग किया जाता है?

उत्तर

1

एक ThreadPool अधिक धागे जो सामूहिक रूप से प्रबंधित किया जा सकता से एक का एक पूल है। जावा में ThreadPoolExecutor में भी एक कतार है जबकि आप इसे चलाने के लिए रननेबल या कॉल करने योग्य देते हैं और यह एक भविष्य लौटा सकता है जो आपको कार्य को नियंत्रित करने या परिणाम प्राप्त करने की अनुमति देता है।

एक सेमाफोर केवल आपके जैसे परमिट की एक संख्या प्राप्त करने की अनुमति देता है यह कुछ थ्रेड को कुछ कोड चलाने की अनुमति दे सकता है। आपको इसे एक उद्देश्य देने के लिए चल रहे कई धागे की आवश्यकता है, लेकिन अन्यथा वे असंबंधित हैं।

Btw: मैं जावा 7 के लिए प्रलेखन के रूप में जावा 5.0 कुछ समय के लिए किया गया है EOL पढ़ता था और जावा 6 की नि: शुल्क सेवा एक अंत में लगभग है।

+0

जावा 7 डॉक्स के लिए इंगित करने के लिए धन्यवाद। मैं बस googled और लिंक खोलो। – mehta

+0

Google लिंक के लिए थोड़ी देर पुराना है। यह अक्सर आपको 1.4.2 देता है। –

+1

Google खोज: XXX के साथ "जावा 7 XXX" = कक्षा का नाम 99% समय काम करता है। उदाहरण के लिए: [जावा 7 सेमफोर के लिए खोजें] (https://www.google.co.uk/search?q=java+7+semaphore)। – assylias

4

सबसे पहले, वहाँ बेवकूफ सवाल के रूप में ऐसी बात नहीं है ...

Semaphore से अधिक थ्रेड के लिए "अधिग्रहण" एक संसाधन अनुमति देता है। उन्हें जांचना चाहिए कि संसाधन उपलब्ध है या नहीं। यह प्रवाह नियंत्रण के लिए वाल्व की तरह है।

एक Lock विशेष उपयोग के लिए है। एक समय में केवल एक धागा।

ThreadPoolExecutor आपको थ्रेड की एक सीमित राशि का उपयोग करके कुछ कोड (रननेबल या कॉल करने योग्य वर्ग) चलाने की अनुमति देता है। आपको इसे स्वयं बनाने के बारे में परेशान करने की आवश्यकता नहीं है, यह आपके लिए जेएसई एपीआई में पहले ही लागू हो चुका है। आप कुछ सेफफोर्स और कतारों के साथ अपना खुद का काम कर सकते हैं ... लेकिन यदि आपके पास कोई अच्छा कारण नहीं है तो अपना समय बर्बाद न करें।

इमेजिंग आपको एक वेब सर्वर को लागू करना है जो पोर्ट 80 के लिए कुछ अनुरोध प्राप्त करता है। आप उसी पोर्ट का उपयोग नहीं करना चाहते हैं जो पूरे बंदरगाह को संसाधित करने के लिए इस बंदरगाह को सुन रहा है (यह संसाधनों का अपशिष्ट है ...) । आप अनुरोध के साथ ThreadPoolExecutor सौदे का उपयोग कर सकते हैं, इसे संसाधित कर सकते हैं और ग्राहक को जवाब दे सकते हैं। मौजूदा CPUs का लाभ लेने के लिए ThreadPoolExecutor को कॉन्फ़िगर किया जा सकता है: इस आर्किटेक्चर और इस कार्य के लिए खतरों की इष्टतम संख्या।

Concurrency in practice इस मामले पर आपके ज्ञान को बेहतर बनाने के लिए एक अच्छी किताब है।

मैं तुम्हें और खेद मेरी बुनियादी अंग्रेजी के लिए यह सहायता की उम्मीद है।

संबंधित मुद्दे