2011-04-10 18 views
5

पर विशेषताओं को जोड़ें मैं जावा में वर्तमान Thread पर attributes 'कैसे सेट कर सकता हूं, मैं कुंजी-मान सेट करना चाहता हूं और मान को किसी अन्य स्थान पर प्राप्त करना चाहता हूं, लेकिन उसी थ्रेड में। इस http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.htmlवर्तमान जावा थ्रेड

उत्तर

13

मुझे नहीं लगता कि आप जावा में दिए गए किसी भी थ्रेड में विशेषताओं को जोड़ सकते हैं, लेकिन आप ThreadLocal उदाहरण का उपयोग प्रति थ्रेड के किसी विशेष जानकारी को स्टोर करने के लिए कर सकते हैं।

ThreadAttributes.get("attribute"); //to get an attribute 
ThreadAttributes.set("attribute", "toValue"); //to set an attribute 

चेतावनी:: सिर्फ इस

import java.util.HashMap; 
import java.util.Map; 

public class ThreadAttributes { 
    private static ThreadLocal<Map<String, String>> threadAttrs = new ThreadLocal<Map<String, String>>() { 
     @Override 
     protected Map<String, String> initialValue() { 
      return new HashMap<String, String>(); 
     } 
    }; 

    public static String get(String key) { 
     return threadAttrs.get().get(key); 
    } 

    public static void set(String key, String value) { 
     threadAttrs.get().put(key, value); 
    } 
} 

इसका इस्तेमाल करने के लिए:

http://download.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html

+1

यह ठीक है कि यह log4j एमडीसी में कैसे किया जाता है, और ईजेबी लेनदेन संदर्भ और सुरक्षा संदर्भ अनुरोध के दौरान उसी तरह से किया जाता है - यह एक कारण है कि ईजेबी अपने धागे शुरू करने से रोकता है। –

4

यहाँ @ edalorzo के जवाब के लिए नमूना कोड है कि अगर आप आवेदन बहुत सारे सूत्र बनाता है और उन्हें पुन: उपयोग नहीं कर रहा है यह कोड संभावित रूप से HashMap एस रिसाव करेगा।

+0

दूसरी तरफ थ्रेडलोकल वेरिएबल्स में थ्रेड पूल के साथ समस्याएं होती हैं, क्योंकि जब पूल से एक ट्रेड का पुन: उपयोग किया जाता है, तो इसे उसी थ्रेड स्थानीय चर को असाइन किया जाएगा जैसा कि आखिरी बार उपयोग में था। इसलिए, यह जांचना महत्वपूर्ण है कि यह कोई मुद्दा नहीं है। –

+1

यह बहुत सच है। मुझे लगता है कि यह वास्तव में आवश्यकता पर निर्भर करता है। यदि आपको ऐसे गुणों की आवश्यकता है जो कार्य-स्कोप्ड (उदाहरण के लिए 'रननेबल # रन()' -स्कोप्ड) हैं, तो Google Guice ढांचे के लिए स्रोत कोड को देखने लायक हो सकता है, जो आपको उदाहरणों का दायरा देने की अनुमति देता है। – rodion

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