2012-11-28 16 views
5

ठीक देता है, मुझे पता है कि यह कैसे धागे वास्तव में काम की probabblly MZ बुरा समझ है, लेकिन जब तक किसी को मदद करता है मुझे समझने मेरा मानना ​​है कि है कि यह एक बग :)थ्रेड getName() गलत नाम

मेरी मुख्य वर्ग में है और इसकी मुख्य() विधि मेरे पास है:

public static void main(String args[]){ 
    StoneBucket stoneBucket = new StoneBucket();  
    StonePutter spRunnable = new StonePutter(stoneBucket); 
    StoneThrower stRunnable = new StoneThrower(stoneBucket); 
    StoneThrower stRunnable2 = new StoneThrower(stoneBucket); 

    //Create the Threads that will take the Runnables as arguments 
    Thread puttingThread = new Thread(spRunnable); 
    Thread throwingThread = new Thread(stRunnable); 
    Thread throwingThread2 = new Thread(stRunnable); 

    puttingThread.setName("Putter"); 
    throwingThread.setName("Thrower 1"); 
    throwingThread2.setName("Thrower 2"); 
    [...] 

और फिर मेरी StoneThrower कक्षा में जब मैं संकलन और इस कोड को मैं हो रही है चलाने मैं

public class StoneThrower implements Runnable{ 

private StoneBucket sb; 
private String name; 

public StoneThrower(StoneBucket _sb){ 
    this.sb = _sb; 
} 

public void run(){ 

    name = Thread.currentThread().getName();   
    System.out.println("T::"+name+" started...");  
    int count = 0;  
    while(true){ 
      [...] 

है:

Screenshot of 2 threads...

तो, मेरे सवाल यही वजह है कि इन धागे के दोनों currentThread().getName() लिए एक ही नाम वापसी करते हैं? जब उन्हें बनाया गया था तो उन्हें threadX.setName("XXX") के माध्यम से नाम सौंपा गया था और उन रननेबल threadX.start() पर कॉल करके शुरू किए गए हैं ... क्या कोई मुझे यह स्पष्ट कर सकता है?

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

+0

आप कोड की बिट पोस्ट कर सकते हैं जहां धागे शुरू कर रहे हैं:

यहाँ अपने परिदृश्य है? – PearsonArtPhoto

उत्तर

9

ऐसा इसलिए होता है क्योंकि आप अपने StoneThrower के उदाहरण name में थ्रेड नाम संग्रहीत करते हैं। समरूपता के कारण, दूसरा धागा name का मान ओवरराइड करता है कि पहला धागा बस सेट हो गया है और उनमें से दोनों एक ही मूल्य का उत्पादन करते हैं।

1. Thread1#start 
2. Thread2#start 
3. Thread1#runnable#run -> runnable.name = 'Thrower 1' 
4. Thread2#runnable#run -> runnable.name = 'Thrower 2' // overrides 
5. Thread1#runnable#run -> System.out.println(runnable.name) 
6. Thread2#runnable#run -> System.out.println(runnable.name) 
+2

का मोर मिलता है अंततः एक उचित निदान। +1 –

+0

मैंने यह पूछकर एक टिप्पणी जोड़ा।सही उत्तर ध्वज लेने के लिए बहुत बहुत धन्यवाद और क्षमा करें @ एनपीई :( – luigi7up

+0

'स्टोन थ्रोवर' के पूरे कार्यान्वयन को नहीं देखा है, लेकिन यदि आप 'name' को स्थानीय चर में कनवर्ट करते हैं तो शायद आपके पास केवल एक उदाहरण हो सकता है। – hoaz

5

आप एक ही runnable के साथ दोनों धागे बनाने के लिए:

Thread throwingThread = new Thread(stRunnable); 
Thread throwingThread2 = new Thread(stRunnable); 
            ^^^^^^^^^^ stRunnable2? 

आप Runnable वस्तु का एक उदाहरण चर में धागा नाम की दुकान। चूंकि ऑब्जेक्ट को दो धागे से साझा किया जाता है, इसलिए name = Thread.currentThread().getName() निष्पादित करने के लिए दूसरा थ्रेड पहले थ्रेड के नाम को अपने आप से ओवरराइट करता है।

+1

अपने आप में एक ही रननेबल के साथ अलग-अलग धागे बनाना धागे को समान नाम रखने के लिए मजबूर नहीं करता है। कुछ और चल रहा है। –

+0

@TedHopp: इस उदाहरण में, यह करता है। थ्रेड नाम 'रननेबल' ऑब्जेक्ट के आवृत्ति चर में संग्रहीत किया जाता है। चूंकि ऑब्जेक्ट को दो धागे द्वारा साझा किया जाता है, दूसरा नाम 'नाम = थ्रेड.currentThread() निष्पादित करने के लिए मिलता है। GetName()' जीतता है। – NPE

+0

हां, लेकिन जब मैंने यह टिप्पणी की थी तो वह आपके उत्तर का हिस्सा नहीं था। संपादन के साथ, अब यह मेरा +1 कमाता है। –