2012-02-09 10 views
7

कहा जाता है यह पूरी तरह से सैद्धांतिक प्रश्न है क्योंकि मुझे यकीन नहीं है कि इस समस्या का कारण सामान्य होगा।जुड़ने से पहले थ्रेड लौटने से रोकने के लिए कैसे करें() को

कहते हैं, उदाहरण के लिए यदि आप एक धागा है कि आप इसके साथ शुरू शुरू विधि है है

Thread c = new Thread(); 
c.start(); 

सीधे के बाद उसके बाद, आप में शामिल होने() विधि धागे पर फोन विधि आप प्रतीक्षा करने के लिए कर रहे हैं बताने के लिए जब तक धागा जारी रखने के लिए निष्पादित नहीं किया गया था।

c.join(); 

यह एक संभावना है कि धागा संभवतः क्रियान्वित किया जा सकता है और इसमें शामिल होने से पहले विधि खत्म नहीं है, कहा जाता है इसलिए विधि अनजान छोड़ने है कि यह इससे पहले कि यह जारी रखा ग खत्म करने के लिए के लिए इंतजार करना पड़ा? मुझे लगता है कि आप प्रारंभ() विधि को कॉल करने से पहले जॉइन() विधि को कॉल करने का प्रयास कर सकते हैं, फिर भी जब भी मैंने परीक्षण मामलों में यह कोशिश की है, तो एक त्रुटि है।

कोई भी इसके लिए एक संभावित फिक्स जानता है, या JVM इसे संभालता है? जैसा कि मैंने कहा मैं इस स्थिति इस तरह की गति प्रदान करने में सक्षम नहीं किया गया है, लेकिन सैद्धांतिक रूप से यह संभव है ...

+0

यह समस्या क्यों है? –

+0

दूसरों के द्वारा चुने गए उत्तरों के साथ, यह निष्कर्ष निकालना गलत नहीं होगा कि किसी अन्य थ्रेड पर शामिल(), थ्रेड कॉलिंग के लिए मानदंडों की जांच है। – soufrk

उत्तर

10

Thread#join(long millis) स्रोत कोड के अनुसार, isAlive() विधि धागा राज्य जाँच करने के लिए प्रयोग किया जाता है।

/** 
* Tests if this thread is alive. A thread is alive if it has 
* been started and has not yet died. 
* 
* @return <code>true</code> if this thread is alive; 
*   <code>false</code> otherwise. 
*/ 
public final native boolean isAlive(); 

इस विधि जाहिर false लौटाता है यदि धागा समाप्त हो गया है, इसलिए thread.join() बाहर निकलने के तुरंत होगा।

0

जॉइन विधि अर्थशास्त्र का अर्थ है "शामिल होने तक थ्रेड समाप्त होने तक प्रतीक्षा करें", और यह बहु-थ्रेडिंग का समर्थन करने वाली प्रत्येक प्रोग्रामिंग भाषा में मानक है। इसलिए, पहले से ही समाप्त थ्रेड में शामिल होना पूरी तरह से संभव है, JVM बस यह पता लगाएगा कि यह पहले ही समाप्त हो चुका है और कोड निष्पादन के साथ आगे बढ़ता है।

6

c.join() का अर्थ है कि वर्तमान में निष्पादित थ्रेड को c के लिए समाप्त होने से पहले पूरा करना चाहिए। cc.join() पर कॉल करने से पहले पूरी तरह निष्पादित किया जाता है, तो यह स्थिति संतुष्ट होती है, क्योंकि c निष्पादन पूरा कर चुका है। जिस विधि में आप c.join() पर कॉल कर रहे हैं, उसे "इसके बारे में पता नहीं" होगा; c.join() सिर्फ नो-ऑप की तरह होगा।

0

शामिल हों() थ्रेड चलने पर तत्काल वापस आ जाएगा।

2

थ्रेड शुरू होने से पहले आप join() पर कॉल कर सकते हैं, लेकिन क्योंकि थ्रेड शुरू नहीं हुआ है join() तुरंत वापस आ जाएगा।

यदि join() थ्रेड शुरू होने के बाद बुलाया जाता है, और थ्रेड समाप्त हो गया है, join() तुरंत वापस आ जाएगा।

केवल समय join() को अवरुद्ध कर देगा, जबकि Thread.isAlive()

इस कोड को ठीक काम करता है ...

public static void main(String[] args) throws InterruptedException 
    { 
     Thread t = new Thread(new Runnable() 
     { 
     public void run() 
     { 
      System.out.println("thread"); 
     } 
     }); 
     t.join(); 
     System.out.println("joined"); 

     Thread.sleep(2000); 
     System.out.println("call start"); 
     t.start(); 
    } 
संबंधित मुद्दे

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