2010-01-06 17 views
8

मैं थ्रेडलोकल जैसी कक्षा की तलाश में हूं जो थ्रेड के बजाय थ्रेड समूहों पर काम करेगा।क्या जावा में थ्रेड समूह-स्थानीय चर हैं?

यदि ऐसी कोई कक्षा नहीं है (कुछ ओपन सोर्स लाइब्रेरी में) आप इसे कैसे कार्यान्वित करेंगे? WeakHashMap में थ्रेड समूह होने से कुछ बेहतर विचार?

मैं वैश्विक, प्रति-थ्रेड और प्रति-थ्रेड समूह संदर्भों में विभिन्न मानकों के साथ रन-टाइम में ट्यून करने योग्य एक डिबगिंग फ्रेमवर्क लागू कर रहा हूं। एक बहुत ही सरल उदाहरण के रूप में, आप एक रिपोर्टिंग बयान हो सकता है:

debug.log(category, message); 

और कहा कि उस विशिष्ट श्रेणी के साथ लॉग प्रविष्टि केवल प्रदर्शित किया जाएगा जब धागे नेटवर्क अनुरोध सर्विसिंग के समूह में एक धागा द्वारा कहा जाता है निर्दिष्ट करें।

+1

स्पष्टीकरण के लिए आप कुछ उपयोग उदाहरणों को फेंकना चाहेंगे। इसके अलावा आप यह क्यों करना चाहते हैं। –

+0

@ केविन: बस एक प्रेरणा और एक साधारण उदाहरण जोड़ा गया। – Viliam

उत्तर

4

मैं एक थ्रेड स्थानीय में एक मूल्य धारक संग्रहीत करता हूं और उसी समूह के सभी धागे के लिए इसे उसी मान धारक को प्रारंभ करता हूं।

public class ThreadGroupLocal<T> extends ThreadLocal<ValueHolder> { 
    private static class ValueHolder { 
     public Object value; 
    } 
    // Weak & Concurrent would be even the better, but Java API wont offer that :(
    private static ConcurrentMap<ThreadGroup, ValueHolder> map = new ConcurrentHashMap<ThreadGroup, ValueHolder>; 
    private static ValueHolder valueHolderForThread(Thread t) { 
     map.putIfAbsent(t.getThreadGroup(), new ValueHolder()); 
     return map.get(t.getThreadGroup()); 
    } 
    @Override 
    protected ValueHolder initialValue() { 
     return valueHolderForThread(Thread.currentThread()); 
    } 
    public T getValue() { (T) get().value; } 
    public void setValue(T value) { get().value = value; } 
} 

और फिर

ThreadGroupLocal<String> groupLocal = new ThreadGroupLocal<String>(); 
groupLocal.setValue("foo"); 
//... 
String foo = groupLocal.getValue(); 

करता है (आरंभीकरण के लिए उम्मीद) यही कारण है कि का उपयोग वास्तव में एक धागा स्थानीय की तरह प्रदर्शन करते हैं।

+0

आपने ValueHolder को क्यों नहीं बनाया? और आपने इसे थ्रेडलोकल क्यों बढ़ाया? थ्रेडलोकल का उपयोग एक कार्यान्वयन विस्तार है। –

+0

अच्छे अंक, वे विचार करने लायक हैं। मैंने उस कोड को सबूत-ऑफ-अवधारणा के रूप में जल्द से जल्द लिखा है, इसलिए उत्पादन में इसका उपयोग करने से पहले कृपया समीक्षा करें (और परीक्षण !!!)। (पीएस: * मुझे अब याद है क्यों ValueHolder को जेनरेट नहीं किया गया है, क्योंकि वे एक स्थिर हैश मैप में संग्रहीत हैं जो '' में खराब हो जाएंगे, इसलिए आपको किसी भी तरह कास्ट करने की आवश्यकता है।*) – akuhn

+0

+1, बस जो मैं खोज रहा था। क्या आप जानते हैं कि आजकल जावा एपीआई इस सुविधा का समर्थन करता है? – dreamcrash

2

पिछली बार जब मैंने कार्यान्वयन को देखा (कुछ साल पहले) थ्रेड लोकल को थ्रेड आईडी द्वारा अनुक्रमित एक सरल हैश तालिका के रूप में कार्यान्वित किया गया था। सी ++ की दक्षता से कुछ भी फैंसी और मील दूर नहीं है।

आप वही कर सकते हैं और थ्रेड समूह ऑब्जेक्ट का उपयोग अपने स्वयं के थ्रेड समूह स्थानीय हैंश तालिका के लिए कुंजी के रूप में कर सकते हैं।

+0

यहां तक ​​कि (सूर्य) 1.2 को अपडेट नहीं किया गया है। यह बहुत अक्षम है। –

+0

हाँ मुझे पता है कि यह बहुत समय पहले था। – Lothar

+0

मुझे लगता है कि यह थ्रेडलोकल ऑब्जेक्ट द्वारा अनुक्रमित थ्रेड इंस्टेंस के अंदर अब हैश तालिका है। यह सिंक्रनाइज़ेशन ओवरहेड को हटा देता है, प्रति थ्रेड एक निजी हैश टेबल। – Thilo

5

ThreadGroup शायद ही कभी उपयोग किया जाता है, इसलिए प्लेटफार्म समर्थन नहीं है।

[Weak/Identity/Concurrent] HashMap<ThreadGroup,T> का उपयोग केवल काम के बारे में होगा, अगर बहुत तेज़ नहीं है। आप वास्तव में मानचित्र को सभी कमजोर, पहचान और समवर्ती होना चाहते हैं लेकिन जावा लाइब्रेरी के साथ आप केवल एक को चुन सकते हैं।

प्रदर्शन में सुधार करने के लिए, ध्यान दें कि Thread एस ThreadGroup नहीं बदलते हैं। इसलिए, ThreadLocal के साथ मान कैश करें (initialValue ओवरराइड करें)। ThreadLocal में अच्छा प्रदर्शन है (get प्रति दो दर्जन चक्र)।

+0

अच्छा प्रदर्शन चाल, धन्यवाद। प्रदर्शन समस्याओं के लिए – Viliam

+0

+1। क्या आप जानते हैं कि आजकल जावा एपीआई इस सुविधा का समर्थन करता है? – dreamcrash

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