2012-12-04 13 views
16

मैंने अभी जावा की Executors कक्षा और newCachedThreadPool() विधि को देखना शुरू कर दिया है। एपीआई के अनुसार, परिणामस्वरूप थ्रेड पूल नए कार्यों के लिए मौजूदा Thread ऑब्जेक्ट्स का पुन: उपयोग करता है।कैश किए गए थ्रेड पूल मौजूदा थ्रेड का पुन: उपयोग कैसे करते हैं

मैं थोड़ा परेशान हूं कि यह कैसे लागू किया गया है क्योंकि मुझे Thread एपीआई में कोई विधि नहीं मिल सका जो आपको मौजूदा Thread ऑब्जेक्ट का व्यवहार सेट करने देता है।

उदाहरण के लिए, यदि आप एक Runnable वस्तु है, जो Thread कॉल Runnable के run() विधि बनाता से एक नईThread बना सकते हैं। हालांकि, Thread एपीआई में कोई सेटटर विधि नहीं है जो एक तर्क के रूप में Runnable लेता है।

मैं किसी भी पॉइंटर्स की सराहना करता हूं।

+0

उत्तर IOW: 'थ्रेड 'लगभग एक ही कार्य करता है (या मुझे कार्यों के सबसेट को कहना चाहिए)' रननेबल 'और' एक्जिक्यूटर्स सर्विस 'के संयोजन के रूप में अपवाद के साथ कि बाद वाला कॉम्बो आपको लाभ लेने के लिए और अधिक सुविधाएं देता है का। इतना है कि आपको * वास्तव में * यह विचार करना चाहिए कि ऐसा क्यों करते हुए आप अकेले 'थ्रेड' का उपयोग क्यों कर रहे हैं। – BAR

उत्तर

2

निष्पादक पृष्ठभूमि में आपके लिए सबकुछ करते हैं। और हाँ यह केवल मौजूदा थ्रेड एपीआई का उपयोग करता है। http://www.ibm.com/developerworks/library/j-jtp0730/index.html

+0

किसी कारण से मेरी पहली टिप्पणी पोस्ट नहीं की गई थी। स्पष्टीकरण देने के लिए धन्यवाद। जब मैंने सवाल पोस्ट किया तो मैंने गलत तरीके से माना कि धागे को थ्रेड पूल के आंतरिकों का कोई ज्ञान नहीं था। –

4

ThreadPool धागे कि runnable नौकरी ढूंढने है:

लिंक नीचे थ्रेड पूल थ्रेड वर्ग और संग्रह एपीआई का उपयोग कर कार्यान्वित की नमूना कार्यान्वयन है। Runnable से नया धागा शुरू करने के बजाय थ्रेड केवल run() फ़ंक्शन को कॉल करेगा। तो ThreadPool में एक थ्रेड आपके द्वारा प्रदान किए गए Runnable के साथ नहीं बनाया गया है, लेकिन एक ऐसे व्यक्ति के साथ जो जांचता है कि कोई कार्य निष्पादित करने के लिए तैयार है और उन्हें सीधे कॉल करता है।

while(needsToKeepRunning()){ 
    if(hasMoreTasks()){ 
     getFirstTask().run();. 
    } 
    else 
    { 
     waitForOtherTasks(); 
    } 
} 

बेशक यह बहुत ज्यादा प्रतीक्षा के साथ वास्तविक कार्यान्वयन सरल है और अधिक सुंदर है:

तो यह कुछ इस तरह दिखेगा। कैसे यह वास्तव में काम करता है Concurrency in Practice

+0

धन्यवाद। समझ गया। (और उन सभी लोगों के लिए धन्यवाद जिन्होंने मेरे प्रश्न का उत्तर दिया।) –

2

में पाया जा सकता के बारे में जानकारी का एक बड़ा स्रोत खैर धागा केवल runnables जो उसे आवंटित कर रहे हैं पर Runnable.run() कॉल करने के लिए है ...

3

धागे में बनाई गई हैं केवल एक बार थ्रेड पूल एपीआई (मामलों में छोड़कर जब कुछ अपवाद के कारण थ्रेड अचानक निकलता है)

वर्कर थ्रेड कतार को देखने के लिए कि कोई कार्य है या इसका उपयोग करें। तो धागे कभी बाहर नहीं निकलते हैं।

यह केवल एक अमूर्त है कि थ्रेड का पुन: उपयोग किया जाता है (वे वास्तव में कभी भी रोक नहीं सकते हैं)। स्पष्ट रूप से वे निष्क्रिय टाइमआउट और शट डाउन अनुरोध के बाद रुकते हैं।

Runnable -----> थ्रेड ताल (कुछ कार्यकर्ता धागा खपत कि Runnable और दूसरों कुछ और Runnables के लिए प्रतीक्षा)

20

मूल रूप से यह कर पूल से प्रत्येक थ्रेड कल्पना:

public void run() { 
    while(true) { 
     if(tasks available) { 
      Runnable task = taskqueue.dequeue(); 
      task.run(); 
     } else { 
      // wait or whatever 
     } 
    } 
} 
2

एक सरलीकृत स्पष्टीकरण यह है कि जब आप निष्पादक सेवा के लिए रननेबल पास करते हैं तो रननेबल को कतार में डाल दिया जाता है। थ्रेडपूल वर्कर थ्रेड इस कतार से पढ़ता है और कतारबद्ध Runnables रन() विधि को आमंत्रित करता है।

+0

धन्यवाद। जब मैंने सवाल पोस्ट किया तो मैं थ्रेड पूल के कार्यान्वयन का कोई ज्ञान नहीं जानता था। –