मुझे लगता है कि मैं समझ गया कि तुम क्या confuzzabling इसलिए यहाँ मेरी अब जवाब है: (जाहिर है, या आप विशेष रूप से 'फिर से' पर जोर देने के डाल कि सवाल पूछने नहीं होता) शब्दावली एक छोटा सा भ्रामक है:
थ्रेड पूल 'पुन: उपयोग' धागे कैसे करते हैं?
क्या हो रहा है किसी एकल थ्रेड कई कार्यों (आमतौर पर Runnable
के रूप में पारित कार्रवाई करने के लिए इस्तेमाल किया जा सकता है, लेकिन यह अपने 'निष्पादक' ढांचे पर निर्भर है: डिफ़ॉल्ट निष्पादकों Runnable
स्वीकार करता है, लेकिन आप अपने खुद के "निष्पादक लिख सकता है "/ थ्रेड-पूल Runnable
की तुलना में कुछ अधिक जटिल स्वीकार कर रहा है [जैसे, कहें, CancellableRunnable
])।
अब डिफ़ॉल्ट ExecutorService
कार्यान्वयन में यदि किसी थ्रेड को अभी भी उपयोग में होने पर समाप्त किया गया है, तो इसे स्वचालित रूप से एक नए थ्रेड के साथ बदल दिया जाता है, लेकिन यह 'पुन: उपयोग' नहीं है जिसके बारे में वे बात कर रहे हैं। इस मामले में कोई "पुन: उपयोग नहीं" है।
तो यह है कि आप दो बार एक जावा थ्रेड पर start()
कॉल नहीं कर सकते, लेकिन जैसा कि आप एक प्रबंधक करना चाहते हैं आप के रूप में कई Runnable
पारित कर सकते हैं और प्रत्येक Runnable
के run()
विधि एक बार कहा जाता है किया जाएगा सच है।
आप पास कर सकते हैं 30 Runnable
5 जावा Thread
और प्रत्येक कार्यकर्ता धागा कॉल कर रहे हैं, उदाहरण के लिए run()
6 बार (व्यावहारिक रूप से इसकी गारंटी नहीं दे रहा है कि आप वास्तव में 6 Runnable
प्रति Thread
क्रियान्वित हो जाएगा, लेकिन यह एक विस्तार है)।
इस उदाहरण में start()
को 6 बार कहा जाएगा। हर एक को इन 6 start()
ठीक एक बार प्रत्येक Thread
की run()
विधि कॉल करेगा:
Thread.start()
जावाडोक से:
* Causes this thread to begin execution; the Java Virtual Machine
* calls the <code>run</code> method of this thread.
लेकिन तो प्रत्येक थ्रेड के run()
विधि के अंदर Runnable
dequeued किया जाएगा और प्रत्येक Runnable
की run()
विधि को बुलाया जा रहा है। तो प्रत्येक धागा कई Runnable
संसाधित कर सकता है। यही वह है जिसे वे "धागा पुन: उपयोग" कहते हैं।
एक तरह से अपनी खुद की थ्रेड पूल करने के लिए जो करने के लिए आप runnables enqueue और, अपने सूत्र के प्रत्येक है एक बार यह अगले Runnable
(या ब्लॉक) विपंक्ति एक Runnable
की run()
विधि संसाधित किया जाना पूर्ण, पर एक अवरुद्ध कतार उपयोग करने के लिए है और run()
विधि चलाएं, फिर कुल्लाएं और दोहराएं।
मैं भ्रम की स्थिति का हिस्सा लगता है (और यह है एक सा भ्रामक) तथ्य यह है कि एक Thread
एक Runnable
और start()
बुला पर Runnable के run()
विधि कहा जाता है लेता है, जबकि डिफ़ॉल्ट धागा पूल भीRunnable
लेने से आता है ।
टीएल; डॉ थ्रेड पूल थ्रेड मूल रूप से लूप चला रहे हैं जो सबमिट किए गए कार्यों को कतार से बाहर खींचते हैं।जब वे कार्य की सेवा करते हैं तो थ्रेड निष्पादित करना बंद नहीं करते हैं, वे बस अगले को कतार में सबमिट करने की प्रतीक्षा करते हैं। प्रश्न में पूछे गए अनुसार वे कभी भी 'पुनर्मिलन' नहीं करते हैं, क्योंकि वे लगातार चल रहे हैं। – Sogger