2011-09-13 15 views
7

मेरे पास जावा और समरूपता के बारे में एक प्रश्न है।जावा कैश्ड थ्रेड पूल और थ्रेड स्थानीय

मान लें कि मेरे पास एक थ्रेडलोकल चर है जिसे ए कहा जाता है। और मैं नए धागे प्राप्त करने के लिए कैश्ड थ्रेडपूल का उपयोग करता हूं। जब एक थ्रेड का पुन: उपयोग किया जाता है, तो थ्रेडलोकल चर को क्या पसंद होता है? यह वही मान रखता है (क्योंकि यह एक ही धागा है) या यह खाली होता है (जैसे धागा नया था)?

धन्यवाद

उत्तर

10

डिफ़ॉल्ट रूप से थ्रेडलोकल्स को थ्रेड के साथ पुन: उपयोग किया जाता है। आप उन्हें जरूरत है इसे पुनः शुरू करना किए जाने की आप तरीकों नीचे नोट अधिभावी करके कर सकते हैं:

from javadoc for java.util.concurrent.ThreadPoolExecutor

हुक तरीकों इस वर्ग की रक्षा की overridable beforeExecute (java.lang.Thread, जावा प्रदान करता है। lang.Runnable) और बाद के बाद (java.lang.Runnable, java.lang.Throwable) विधियों जिन्हें प्रत्येक कार्य के निष्पादन से पहले और बाद में बुलाया जाता है। इन्हें निष्पादन पर्यावरण में हेरफेर करने के लिए उपयोग किया जा सकता है; उदाहरण के लिए, थ्रेडलोकल्स को पुन: प्रारंभ करना, आंकड़े एकत्र करना, या लॉग प्रविष्टियां जोड़ना। इसके अतिरिक्त, एक्ज़ीक्यूटिव पूरी तरह समाप्त होने के बाद किए जाने वाले किसी भी विशेष प्रसंस्करण को करने के लिए विधि को समाप्त कर दिया जा सकता है। यदि हुक या कॉलबैक विधियां अपवाद फेंकती हैं, तो आंतरिक कार्यकर्ता थ्रेड विफल हो सकते हैं और अचानक समाप्त हो सकते हैं।

+1

एक हल करने योग्य समस्या जो मैं यहां देखता हूं वह यह है कि ThreadPoolExecutor को थ्रेड स्थानीय लोगों से अवगत होना चाहिए। खराब अलगाव की तरह। धागे को निष्पादित करने के बाद एक घटना को फेंकने वाले एक अवलोकन द्वारा हल किया जा सकता है। बाद में एक्सेक्यूट ईवेंट निकाल दिए जाने के बाद एक विशिष्ट थ्रेड स्थानीय (पर्यवेक्षक) एक क्लीनअप कर सकता है। –

3

थ्रेड पूल के लिए वापस आ गया है, तो ThreadLocal चर अभी भी यह करने के लिए संलग्न की जाएगी। पूल के साथ थ्रेडलोकल्स का उपयोग करते समय, आपको पूल से थ्रेड खींचने पर सेट करने में सक्षम होने के लिए सावधान रहना होगा और इसे वापस करने से पहले सेट करना होगा।

2

आप प्रतिबिंब का उपयोग करके थ्रेड के लिए थ्रेड स्थानीय पूल को साफ़ कर सकते हैं। आप

public static void clearAllThreadLocals() { 
    try { 
     Field threadLocals = Thread.class.getDeclaredField("threadLocals"); 
     threadLocals.setAccessible(true); 
     threadLocals.set(Thread.currentThread(), null); 
    } catch (Exception e) { 
     throw new AssertionError(e); 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^