2011-04-14 28 views
6

के साथ कॉल में शामिल होने के बाद जावा थ्रेड के साथ क्या होता है आप टाइमआउट मान के साथ जुड़ने के बाद जावा थ्रेड में कौन सा राज्य होता है, और टाइमआउट पास होता है। तो उदाहरण के लिए आपके पास निम्न कोड है:टाइमआउट

Thread thread = new Thread(); 
thread.start(); 
thread.join(TIMEOUT); 

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

if (thread.isAlive()) 
{ 
    thread.interrupt(); 
    thread = null; 
} 

अगर धागा अभी भी चल रहा है की जाँच करने के लिए और यदि ऐसा है तो इसमें बाधा डालते हैं, और फिर इसे बाहर शून्य यकीन है कि यह कचरा एकत्र हो जाता है बनाने के लिए: मेरी प्रारंभिक धारणा है कि बाद की तरह कुछ कॉल कर में शामिल होने के लिए है।

उत्तर

5

जावाडोक कहता है कि शामिल (समय) फ़ंक्शन थ्रेड के मरने के लिए कई मिलीसेकंडों का इंतजार करेगा। असल में यदि आपका कोड गुजरता है तो आपका कोड अवरुद्ध हो जाएगा और जारी रहेगा। यदि आप इस मामले में 'लीकिंग थ्रेड' के बारे में चिंतित हैं तो आपको शायद फिर से डिजाइन करना चाहिए ताकि आपको धागे में शामिल होने की आवश्यकता न हो और चल रहे धागे की स्थिति का निरीक्षण कर सकें। इसके अलावा धागे पर एक बाधा बुलाओ बुरा मोजो है।

class MyThread extends Thread { 
    private boolean keepRunning = true; 
    private String currentStatus = "Not Running"; 
    public void run() { 
     currentStatus = "Executing" 
     while(keepRunning) 
     { 
      try { 
       someTask() 
       currentStatus = "Done"; 
      } catch (Exception e) { 
       currentStatus = "task failed"; 
       keepRunning = false; 
      } 
     } 
    } 

    public stopThread() { 
     keepRunning = false; 
    } 
} 

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

+1

देखें कि आप Thread.interrupt साथ धागा (बाधित करने के लिए योजना बना रहे हैं) आप लूप के प्रवेश बिंदु में Thread.interrupted() की जांच करनी चाहिए। –

+0

उदाहरण कोड के लिए धन्यवाद। मैं ठीक वही कर रहा था और धागे के राज्यों को परिभाषित कर रहा था, और यदि यह समय समाप्त हो गया तो मैं धागे को रद्द कर देता हूं। एक बार जब मैं एसएनएस मंच पर जाता हूं तो मैं मेमोरी/थ्रेड लीक –

0

join कॉलिंग थ्रेड थ्रेड join पर मरने के लिए इंतजार कर रहा था, मरने के लिए, यानी इसे निष्पादित करना समाप्त हो गया। तो आपके उदाहरण में thread की स्थिति समाप्त होने के समय TERMINATED (यही कारण है कि समय-समय पर join 'स्वाभाविक रूप से' लौटने का विरोध हुआ (जिस स्थिति में threadTERMINATED राज्य में होगा) - बेशक, thread समय-समय पर होने के ठीक बाद TERMINATED स्थिति में लगभग तुरंत संक्रमण कर सकता था)।

समय समाप्त होने के तुरंत बाद कॉलिंग थ्रेड की स्थिति जल्द ही समाप्त हो जाएगी और उस समय तक, यह TIMED_WAITING राज्य में होगी।

0

मान लें कि आप बाधाओं की जांच कर रहे हैं (Thread.interrupted(), और interruptedException) मुझे कोई कारण नहीं दिख रहा है कि यह क्यों काम नहीं करना चाहिए।

में शामिल होने के खत्म होने के बाद सफलतापूर्वक मुझे लगता है कि धागा किसी भी Thread.State में हो सकता है, लेकिन नई

1

और समय समाप्ति पास और धागा वापस नहीं आया राज्य क्या है?

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

इस कोड के बारे में:

if (thread.isAlive()) { 
    thread.interrupt(); 
    thread = null; 
} 

करने की गारंटी है कि अगर थ्रेड अभी भी जिंदा है तो बाधा उत्पन्न करें। (एक छोटा सा मौका है कि आप टर्मिनेटेड राज्य में एक थ्रेड को बाधित करने का प्रयास करेंगे, लेकिन interrupt() के लिए जावाडोक की मेरी पढ़ाई यह है कि यह हानिरहित है।)

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

nullthread करने का काम कम प्रभाव पड़ेगा। अगर धागा अभी भी चल रहा है, तो यह/उसके संसाधन कचरा नहीं होगा वैसे भी। अगर धागा समाप्त हो जाता है, तो यह कचरा संग्रह के लिए योग्य Thread ऑब्जेक्ट प्रस्तुत कर सकता है। लेकिन इससे ज्यादा अंतर नहीं आएगा। जब एक धागा टर्मिनेटेड राज्य में जाता है, तो इसका ढेर स्वचालित रूप से मुक्त हो जाता है, इसे अपने थ्रेड समूह से निकाल दिया जाता है, और इसके लिंक को Runnable पर हटा दिया जाता है। एक बार ऐसा करने के बाद, थ्रेड ऑब्जेक्ट में स्मृति की न्यूनतम मात्रा होती है: भंडारण रिसाव के परिप्रेक्ष्य से संबंधित कुछ भी नहीं होना चाहिए।

+0

की जांच करूंगा, मुझे नहीं लगता कि थ्रेड टी 1 कॉलिंग थ्रेड टी 0 में शामिल होने से जे 0 की स्थिति में बदलाव आएगा। क्या होगा यदि शामिल होने से टी 1 बार और फिर टी 1 (या कोई अन्य धागा) फिर से जुड़ने की कोशिश करता है? – seand

+0

आप सही हैं। लेकिन मुझे नहीं लगता कि मैंने कहा या कहा कि ... या ओपी ने कहा या कहा। –

3

टाइमआउट के साथ जुड़ने का उपयोग करके थोड़ा खतरा है। कुछ परिस्थितियों में बुला धागा विधि हमेशा के लिए में शामिल होने में फंस जाएगा, भले ही हम एक टाइमआउट पारित ...

, http://insidecoffe.blogspot.com/2011/12/when-timeout-fails-in-threadjoin.html

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