2010-04-18 12 views
17

मैं थ्रेड के बारे में पढ़ रहा था और पाया कि हम उसी थ्रेड इंस्टेंस पर दो बार स्टार्ट विधि को कॉल नहीं कर सकते हैं। लेकिन मुझे इसके लिए सही कारण समझ में नहीं आया। तो हम इसे दो बार या उससे भी ज्यादा बार क्यों नहीं बुला सकते?हम थ्रेड ऑब्जेक्ट के उसी उदाहरण पर दो बार स्टार्ट विधि क्यों नहीं बुला सकते?

+0

अच्छा सवाल - मैं हमेशा पूछे बिना दस्तावेज़ों का अंधाधुंध पालन करता हूं। +1 –

+3

यदि आपको एक ही चीज़ को एकाधिक थ्रेड में करने की आवश्यकता है, तो आप रननेबल को कार्यान्वित कर सकते हैं और थ्रेड क्लास के कई उदाहरणों के लिए एक ही रननेबल को पास कर सकते हैं। – Yishai

+0

@Yishai, हाँ आप संस्कार कर रहे हैं, लेकिन एक ही थ्रेड उदाहरण पर क्यों नहीं? – GuruKulki

उत्तर

9

मेरी राय में थ्रेड ऑब्जेक्ट वास्तविक चल रहे संदर्भ के लिए आपका "हैंडल" है। यदि आप एक ही java.lang से जुड़े कई समवर्ती निष्पादन की अनुमति देते हैं। थ्रेड, आप getStackTrace() और getState() विधियों को वापस करने की अपेक्षा करेंगे?

मुझे लगता है कि थ्रेड क्लास को कई चल रहे संदर्भों को बढ़ाने की अनुमति देने के लिए डिज़ाइन किया जा सकता था, लेकिन इसकी एपीआई कम सरल और साफ होगी।

5

आप 1 थ्रेड के लिए 1 उदाहरण चाहते हैं, क्योंकि उस थ्रेड में आंतरिक स्थिति है, यह प्रबंधित करेगी।

धागे को एक प्रकार के संसाधन के रूप में देखें। आमतौर पर यह समझ में नहीं आता है कि 1 उदाहरण कई संसाधनों को संदर्भित करता है - (जैसे कि आपके पास जावा फ़ाइल ऑब्जेक्ट नहीं हो सकता है, 1 से अधिक फाइलों का संदर्भ लें)।

यदि आप दो बार धागा शुरू करते हैं, तो यह आपको सभी प्रकार की परेशानी में भी ले जाएगा, और आप या तो Thread से विरासत में मिला है और कुछ उदाहरण चर बनाए हैं जो अब 1 से अधिक धागे तक पहुंचते हैं, - वही बात अगर आप थ्रेड बनाते हैं Runnable। कम से कम एपीआई इसे स्क्रू-अप करने के लिए कोई ब्रेनर नहीं बनाता है।

राज्यों पर एक नजर डालें एक सूत्र में हो सकता है, यहां http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.State.html

मूल रूप से, केवल समय आप एक धागा शुरू कर सकते हैं जब यह NEW राज्य में है। और अन्य राज्यों में से कोई भी इसे वापस NEW

0

Thread थ्रेड के समान नहीं है।

ए (छोटा-टी) थ्रेड आपके कोड का एक स्वतंत्र निष्पादन है। ए (बिग-टी) Thread एक जावा ऑब्जेक्ट है जिसका उपयोग छोटे-छोटे धागे के जीवन चक्र को शुरू करने और प्रबंधित करने के लिए किया जा सकता है।

मान लीजिए कि आपको बीमा कंपनी के लिए कोड लिखने के लिए किराए पर लिया गया था, और आपने एक (बिग-ए) दुर्घटना का प्रतिनिधित्व करने के लिए एक (बिग-ए) Accident कक्षा परिभाषित की है। कोई आपको पूछता है, "मैं Accident उदाहरण का पुन: उपयोग क्यों नहीं कर सकता?"

ठीक है, एक दुर्घटना केवल एक बार हो सकती है, है ना? भले ही एक ही दिन में सटीक उसी तरह के ड्राइवरों और कारों के साथ एक ही तरह की चीज होती है, फिर भी यह एक अलग दुर्घटना है, है ना?

1

थ्रेड लाइफ चक्र के अनुसार, एक बार धागा 'मृत' है, आप इसे पुनरारंभ नहीं कर सकते हैं। आप केवल नए थ्रेड को शुरू करने() विधि शुरू कर सकते हैं।

थ्रेड Runnable राज्य नहीं से मृत राज्य से राज्य चल रहा है करने के लिए खरीदा जा सकता है।

0

यह मेरी राय है, यह थ्रेड आईडी के कारण है। थ्रेड शेड्यूलर थ्रेड आईडी के माध्यम से धागे की पहचान कर रहा है। यह अद्वितीय वास्तविक संख्या है। कृपया नीचे कोड,

public class StartTwice extends Thread { 

    public void run() { 
     System.out.println("running..."); 
    } 

    public static void main(String[] args) { 

     StartTwice start1 = new StartTwice(); 
     System.out.println("Thread id: " + start1.getId()); 
     start1.start(); 

     start1 = new StartTwice(); 
     System.out.println("Thread id: " + start1.getId()); 
     start1.start(); 
    } 

} 

Output is: 

Thread id: 10 
Thread id: 11 
running... 
running... 

जब मैं start1 ऑब्जेक्ट को पुन: प्रारंभ करता हूं। एक नया धागा आईडी बनाया गया है।

पीएस: यहां तक ​​कि एक धागा भी किया जाता है, हम दूसरी वस्तु (थ्रेड आईडी) का उपयोग दूसरी बार नहीं कर सकते हैं। जब तक कि JVM उस आईडी का पुन: उपयोग नहीं करता है।

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