2012-05-31 17 views
8

तो मैं एक खेल के लिए धागे के साथ काम करने की कोशिश कर रहा हूं। मैं बहुत विषय के लिए नया हूं इसलिए मैं सही ढंग से समझ नहीं पा रहा हूं। मेरा सवाल यह है कि जावा एपीआई की थ्रेड क्लास में currentThread() विधि कैसे काम करती है। एपीआई कहता है "वर्तमान में निष्पादित थ्रेड ऑब्जेक्ट का संदर्भ देता है।", लेकिन जहां तक ​​मैं एक ही समय में कई धागे चलाता हूं। केवल एक निष्पादन धागा वापस करना संभव है?वर्तमान थ्रेड विधि जावा

+0

आपको थ्रेडिंग के बारे में कुछ ट्यूटोरियल पढ़ना चाहिए। – Sajmon

+2

मुझे लगता है कि उन्हें इसे नामित करना चाहिए था (स्वयं) या ऐसा कुछ, क्योंकि मल्टीकोर सीपीयू के साथ वर्तमान में एक से अधिक थ्रेड निष्पादित हो सकता है। – goat

उत्तर

6

currentThread पर कॉल करने वाले कोड को थ्रेड में से एक में निष्पादित किया जाएगा, न कि उनमें से सभी में, इसलिए यह उस धागे को विशेष रूप से प्राप्त कर सकता है।

+0

धन्यवाद जो इसे बहुत स्पष्ट बनाता है। – user1427380

4

जब आपके कोड में कोई निर्देश निष्पादित होता है, तो इसे किसी विशिष्ट थ्रेड के भीतर निष्पादित किया जाता है। यह उस विधि द्वारा लौटा धागा है।

जाहिर है, यदि एकाधिक थ्रेड द्वारा एक विशिष्ट विधि निष्पादित की जाती है, तो प्रत्येक निष्पादन Thread.currentThread() के लिए एक अलग मान वापस कर सकता है।

आप इस छोटे से उदाहरण का प्रयास कर सकते हैं कि क्या हो रहा है और विशेष रूप से तथ्य यह है कि 2 धागे समानांतर में निष्पादित होते हैं। आप यह देखना चाहिए कि t1 कुछ पाश चलेंगे तो t2 T1 के लिए आदि भी ऐसा ही करने और वापस होगा (आप अपने मशीन के आधार पर एक उच्च संख्या 5 से छोरों की संख्या बढ़ाने की आवश्यकता हो सकती है):

public class TestThread { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       for (int i = 0; i < 5; i++) { 
        System.out.println(Thread.currentThread()); 
       } 
      } 
     }; 

     Thread t1 = new Thread(r, "t1"); 
     Thread t2 = new Thread(r, "t2"); 
     t1.start(); 
     t2.start(); 
    } 
} 
+1

आपको वर्तमान थ्रेड को लूप में प्रिंट करने की आवश्यकता क्यों होगी? एक बार पर्याप्त होना चाहिए, मुझे लगता है। – Jeffrey

+0

मुझे आपके पहले 2 वाक्यों को पसंद है ... लेकिन शेष पोस्ट, विशेष रूप से कोड, भ्रामक होने के लिए पर्याप्त अस्पष्ट लगता है। – goat

+0

@ जेफरी का विचार कुछ इंटरलिविंग दिखाना था जहां एक थ्रेड दो बार लूप चला सकता है, दूसरा दूसरा सक्रिय हो जाता है। – assylias

0

"वर्तमान में निष्पादित थ्रेड" का अर्थ है कि सिस्टम शेड्यूलर ने इस कोड को अपने कोड को निष्पादित करने के लिए कुछ समय दिया है।

-1

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

+0

मल्टीकोर मशीनें वास्तव में एक बार में कई धागे चलाती हैं। मुझे एक कोर-मशीन पर काम करने वाले बड़े पैमाने पर बहुसंख्यक प्रोग्राम (अत्यधिक इंटरैक्टिव धागे के साथ) मिला, फिर इसे 4 कोर वाले मशीन पर ले जाया गया। वह एक असली शिक्षा थी। – RalphChapin

+0

"एकाधिक थ्रेड एक ही समय में _neccessly_ चल रहे नहीं हैं ..." – jdv

4

मान लें कि आपके पास कागज के टुकड़े पर मुद्रित निर्देशों की सूची है। एक व्यक्ति निर्देश पढ़ता है और उन्हें निष्पादित करता है। निर्देश एक कार्यक्रम हैं। व्यक्ति एक धागा है। आप कागज की कई प्रतियां बना सकते हैं और उन्हें कई लोगों तक पहुंचा सकते हैं। अगर निर्देश कुछ कहते हैं, "खुद को थप्पड़ मारो," स्वयं उस व्यक्ति से उस निर्देश को पढ़ रहा है। इसी तरह, Thread.currentThread() उस थ्रेड को संदर्भित करता है जो उस कॉल को currentThread() पर निष्पादित कर रहा है।

0

एक थ्रेडेड एप्लिकेशन लिखते समय, आप अपने प्रोग्राम पर निर्देश की एक श्रृंखला की तरह तर्क कर सकते हैं, प्रत्येक पिछले के बाद निष्पादित किया गया है (यह एक अनुमानित अनुमान है, लेकिन अवधारणात्मक संकलक और प्रोसेसर इसे अनुकरण करने और काम करने की कोशिश करता है अगर यह वास्तव में क्या हो रहा था)।

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

तो कुछ कोड निष्पादित करने के लिए, यह एक थ्रेड के संदर्भ में किया जाना चाहिए (आपके एप्लिकेशन को शुरू होने पर ऑपरेटिंग सिस्टम द्वारा बनाया गया एक है, जो Main विधि पर इसके निष्पादन को शुरू करता है)। जब फ़ंक्शन currentThread कहा जाता है, तो यह उन संदर्भों में से एक में है।

धागा बनाने के दौरान जावा रनटाइम थ्रेड संदर्भ में उस Thread ऑब्जेक्ट का संदर्भ संग्रहीत करेगा, और currentThread बस वहां देखेगा और वर्तमान धागे को वापस कर देगा।

0

किसी भी समय दिए गए बिंदु पर, केवल एक धागा निष्पादित होगा (लाइव), इसलिए Thread.currentThread() वर्तमान में निष्पादित थ्रेड का विवरण देता है। उदाहरण के लिए, थ्रेड_नाम, प्राथमिकता, method_name।

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