हैंडलर और थ्रेड का उपयोग करने के क्या फायदे / कारण हैं?
एक हैंडलर आपको Runnable
एक थ्रेड से जुड़े संदेश और ऑब्जेक्ट भेजने और संसाधित करने की अनुमति देता है MessageQueue
। प्रत्येक Handler
उदाहरण एक धागे से जुड़ा होता है और उस धागे की संदेश कतार।
जब आप एक नया बनाते हैं Handler
, तो यह उस थ्रेड के थ्रेड / मैसेज कतार के लिए बाध्य होता है, जो इसे बना रहा है - उस बिंदु से, यह मैसेज और रनवेबल्स को उस मैसेज कतार तक पहुंचाएगा और उन्हें मैसेज क्यू से बाहर आने पर निष्पादित करेगा। ।
हैंडलर के दो मुख्य उपयोग हैं:
- भविष्य में कुछ बिंदु के रूप में निष्पादित किए जाने वाले संदेशों और Runnables को शेड्यूल करने के लिए
- करने के लिए enqueue एक कार्रवाई अपनी खुद की तुलना में एक अलग धागा पर प्रदर्शन किया जाना है।
यदि आप जावा थ्रेड्स का उपयोग करते हैं, तो आपको अपने आप ही somethings को संभालना होगा - मुख्य धागे के साथ सिंक्रनाइज़ करना, एक धागा रद्द करना आदि।
यह सिंगल थ्रेड तब तक थ्रेड पूल नहीं बनाता है जब तक कि आप उपयोग ThreadPoolExecutor
या ExecutorService
एपीआई नहीं करते हैं।
(ब्लैकबेल्ट उत्तर पर अपनी टिप्पणियों से इस प्रश्न को लिया)
एक्सिक्यूटर का उपयोग क्यों नहीं किया जाता है? और यहां तक कि अगर मैं ऐसा करने के लिए एक हैंडलर का उपयोग करना चाहता था, तो कैसे?
संदर्भ: थ्रेड प्रदर्शन लेख
कुछ प्रकार के कार्य हैं जिन्हें अत्यधिक समानांतर, वितरित कार्यों में घटाया जा सकता है। काम के पैकेट की सरासर मात्रा के साथ यह बनाता है, AsyncTask
और HandlerThread
उपयुक्त कक्षाएं नहीं हैं। एकल-थ्रेडेड प्रकृति AsyncTask
सभी थ्रेडेड कार्य को एक लीनियर सिस्टम में बदल देगी। HandlerThread
दूसरी ओर, कक्षा का उपयोग करना , प्रोग्रामर को थ्रेड्स के समूह के बीच लोड संतुलन को मैन्युअल रूप से प्रबंधित करने की आवश्यकता होगी।
ThreadPoolExecutor इस प्रक्रिया को आसान बनाने के लिए एक सहायक वर्ग है। यह वर्ग थ्रेड्स के एक समूह के निर्माण का प्रबंधन करता है, उनकी प्राथमिकताएं निर्धारित करता है, और उन थ्रेड्स के बीच काम कैसे वितरित किया जाता है, का प्रबंधन करता है। जैसे ही कार्यभार बढ़ता है या घटता है, वर्ग कार्यभार को समायोजित करने के लिए अधिक थ्रेड्स को नष्ट या नष्ट कर देता है।
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
आप अधिक विवरण के लिए इस थ्रेड गाइड पर डेवलपर गाइड लेख का उल्लेख कर सकते हैं ।
Handler
कई रन करने योग्य उदाहरणों को चलाने के उपयोग के लिए इस पोस्ट पर एक नज़र डालें । इस स्थिति में, सभी Runnable
कार्य एक ही थ्रेड में चलेंगे।
Android: एक धागे में टोस्ट