मैं InheritableThreadLocal
और ThreadPoolExecutor
दोनों का उपयोग करने का प्रयास कर रहा हूं।ThreadPoolExecutor के साथ इनहेरटेबल थ्रेडलोकल का उपयोग करना - या - एक थ्रेडपूलएक्सएटर जो थ्रेड का पुन: उपयोग नहीं करता है
यह टूट जाता है क्योंकि ThreadPoolExecutor
प्रत्येक पूल के लिए धागे का उपयोग करता है (यह एक पूल है, सब के बाद), जिसका अर्थ है InheritableThreadLocal
अपेक्षित काम नहीं करता है। अब समस्या मेरे लिए स्पष्ट प्रतीत होती है, लेकिन यह ट्रैक करने के लिए विशेष रूप से अस्पष्ट था।
मैं InheritableThreadLocal
का उपयोग करता हूं ताकि कई शीर्ष-स्तरीय प्रक्रियाओं में से प्रत्येक के लिए अपना स्वयं का डेटाबेस कनेक्शन हो और यह उप-प्रक्रियाएं उत्पन्न हो जाएं। मैं सिर्फ एक साझा कनेक्शन पूल का उपयोग नहीं करता क्योंकि प्रत्येक शीर्ष-स्तरीय प्रक्रिया डेटाबेस से पहले और/या तैयार किए गए बहुत से तैयार किए गए स्टार्टमेंट तैयार करने से पहले इसके कनेक्शन के साथ बहुत से बहु-चरण कार्य करेगी।
मैं इन शीर्ष-स्तरीय प्रक्रियाओं के बीच साझा ThreadPoolExecutor
का उपयोग करता हूं क्योंकि कुछ व्यवहार हैं जिन्हें गेट करने की आवश्यकता है। जैसे भले ही मेरे पास 4 शीर्ष-स्तरीय प्रक्रियाएं चल रही हों, मेरे पास एक समय में डेटाबेस में कोई भी प्रक्रिया लिख सकती है (या सिस्टम को किसी अन्य साझा संसाधन पर गेट की आवश्यकता है)। तो मेरे पास शीर्ष-स्तरीय प्रक्रिया Runnable
बनाएगी और यह सुनिश्चित करने के लिए साझा की गई ThreadPoolExecutor
पर भेज दी जाएगी कि पूरे सिस्टम में एक से अधिक (या दो या तीन मामले हो सकते हैं) एक ही समय में चल रहे हैं।
समस्या यह है कि ThreadPoolExecutor
पूल के लिए अपने धागे का पुन: उपयोग करता है, InheritableThreadLocal
उस पूल में चलने वाले मूल मान को उठा रहा है जो शीर्ष-स्तरीय प्रक्रिया में मौजूद मान के बजाए उस पूल में चलाया गया था जो रननेबल को भेजा गया था ThreadPoolExecutor
।
वहाँ
InheritableThreadLocal
मूल्य है कि प्रक्रिया है जिसके बल्कि पुन: उपयोग किया थ्रेड पूल के संदर्भ से Runnable बनाया के संदर्भ में था का उपयोग करने केThreadPoolExecutor
में कार्यकर्ता पूल मजबूर करने के लिए कोई तरीका है?वैकल्पिक रूप से, क्या
ThreadPoolExecutor
का कोई कार्यान्वयन है जो हर बार एक नया थ्रेड बनाता है जब यह एक नया रननेबल शुरू होता है? मेरे उद्देश्यों के लिए मैं केवल एक निश्चित आकार में एक साथ चलने वाले धागे की संख्या को गेट करने की परवाह करता हूं।क्या कोई अन्य समाधान या सुझाव है जो मैंने ऊपर वर्णित किए गए कार्यों को पूरा करने के लिए किया है?
(जबकि मुझे पता है मैं समुदाय साइकिल के कुछ प्रकार की तरह subthread को subthread के वर्ग के लिए कक्षा से डेटाबेस कनेक्शन के आसपास पारित करके समस्या का समाधान हो सकता है, मैं इस से बचने के लिए चाहते हैं।)
StackOverflow, InheritableThreadLocal and thread pools पर एक पिछला प्रश्न है, जो इस समस्या को भी संबोधित करता है। हालांकि, उस समस्या का समाधान यह प्रतीत होता है कि यह इनहेरटेबल थ्रेडलोकल के लिए एक खराब उपयोग केस है, जो मुझे नहीं लगता कि मेरी स्थिति पर लागू होता है।
किसी भी विचार के लिए धन्यवाद।
मैंने सेमाफोर का उपयोग नहीं किया है, इसलिए मैं इसे देख लूंगा। हम निष्पादकों (फ्यूचर्स, टाइमआउट इत्यादि) की कई अन्य विशेषताओं का उपयोग करते हैं, लेकिन यह संभव है कि मैं सेमफोरस के साथ ऐसा कर सकूं या मैं नियमित रूप से निष्पादक (थ्रेड पूल नहीं) का उपयोग कर सकता हूं ताकि सब कुछ प्राप्त करने के लिए सेमफोरों के साथ। धन्यवाद। –
यह जाने का सही तरीका था। सेमफोरस और फ्यूचरटास्क का उपयोग करना हम जो करना चाहते थे उसके लिए एक अधिक प्रतिनिधि प्रतिमान था। परिवर्तन के बाद कोड बहुत सरल था, जो हमेशा एक अच्छा संकेत है। इसके अलावा यह किसी भी इनहेरटेबल थ्रेडलोकल मुद्दों को हल करता है। –