मैं थ्रेड के बारे में पढ़ रहा था और पाया कि हम उसी थ्रेड इंस्टेंस पर दो बार स्टार्ट विधि को कॉल नहीं कर सकते हैं। लेकिन मुझे इसके लिए सही कारण समझ में नहीं आया। तो हम इसे दो बार या उससे भी ज्यादा बार क्यों नहीं बुला सकते?हम थ्रेड ऑब्जेक्ट के उसी उदाहरण पर दो बार स्टार्ट विधि क्यों नहीं बुला सकते?
उत्तर
मेरी राय में थ्रेड ऑब्जेक्ट वास्तविक चल रहे संदर्भ के लिए आपका "हैंडल" है। यदि आप एक ही java.lang से जुड़े कई समवर्ती निष्पादन की अनुमति देते हैं। थ्रेड, आप getStackTrace() और getState() विधियों को वापस करने की अपेक्षा करेंगे?
मुझे लगता है कि थ्रेड क्लास को कई चल रहे संदर्भों को बढ़ाने की अनुमति देने के लिए डिज़ाइन किया जा सकता था, लेकिन इसकी एपीआई कम सरल और साफ होगी।
आप 1 थ्रेड के लिए 1 उदाहरण चाहते हैं, क्योंकि उस थ्रेड में आंतरिक स्थिति है, यह प्रबंधित करेगी।
धागे को एक प्रकार के संसाधन के रूप में देखें। आमतौर पर यह समझ में नहीं आता है कि 1 उदाहरण कई संसाधनों को संदर्भित करता है - (जैसे कि आपके पास जावा फ़ाइल ऑब्जेक्ट नहीं हो सकता है, 1 से अधिक फाइलों का संदर्भ लें)।
यदि आप दो बार धागा शुरू करते हैं, तो यह आपको सभी प्रकार की परेशानी में भी ले जाएगा, और आप या तो Thread
से विरासत में मिला है और कुछ उदाहरण चर बनाए हैं जो अब 1 से अधिक धागे तक पहुंचते हैं, - वही बात अगर आप थ्रेड बनाते हैं Runnable
। कम से कम एपीआई इसे स्क्रू-अप करने के लिए कोई ब्रेनर नहीं बनाता है।
राज्यों पर एक नजर डालें एक सूत्र में हो सकता है, यहां http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.State.html
मूल रूप से, केवल समय आप एक धागा शुरू कर सकते हैं जब यह NEW
राज्य में है। और अन्य राज्यों में से कोई भी इसे वापस NEW
ए Thread
थ्रेड के समान नहीं है।
ए (छोटा-टी) थ्रेड आपके कोड का एक स्वतंत्र निष्पादन है। ए (बिग-टी) Thread
एक जावा ऑब्जेक्ट है जिसका उपयोग छोटे-छोटे धागे के जीवन चक्र को शुरू करने और प्रबंधित करने के लिए किया जा सकता है।
मान लीजिए कि आपको बीमा कंपनी के लिए कोड लिखने के लिए किराए पर लिया गया था, और आपने एक (बिग-ए) दुर्घटना का प्रतिनिधित्व करने के लिए एक (बिग-ए) Accident
कक्षा परिभाषित की है। कोई आपको पूछता है, "मैं Accident
उदाहरण का पुन: उपयोग क्यों नहीं कर सकता?"
ठीक है, एक दुर्घटना केवल एक बार हो सकती है, है ना? भले ही एक ही दिन में सटीक उसी तरह के ड्राइवरों और कारों के साथ एक ही तरह की चीज होती है, फिर भी यह एक अलग दुर्घटना है, है ना?
थ्रेड लाइफ चक्र के अनुसार, एक बार धागा 'मृत' है, आप इसे पुनरारंभ नहीं कर सकते हैं। आप केवल नए थ्रेड को शुरू करने() विधि शुरू कर सकते हैं।
थ्रेड Runnable राज्य नहीं से मृत राज्य से राज्य चल रहा है करने के लिए खरीदा जा सकता है।
यह मेरी राय है, यह थ्रेड आईडी के कारण है। थ्रेड शेड्यूलर थ्रेड आईडी के माध्यम से धागे की पहचान कर रहा है। यह अद्वितीय वास्तविक संख्या है। कृपया नीचे कोड,
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 उस आईडी का पुन: उपयोग नहीं करता है।
- 1. उसी विधि पर दो श्रेणियां उसी विधि नाम के साथ
- 2. थ्रेड स्टार्ट रन नहीं है
- 3. UITableView प्रतिनिधि विधि दो बार
- 4. कॉन्फ़िगरेशन पैरामीटर को प्रारंभ करने के लिए हम इनिट विधि के बजाय सर्वलेट कन्स्ट्रक्टर क्यों नहीं बुला सकते?
- 5. थ्रेड। स्टार्ट() बनाम ThreadPool.QueueUserWorkItem()
- 6. मैं खुली फ़ाइल पर दो बार क्यों पढ़ नहीं सकता?
- 7. ऑब्जेक्टिंग दो बार ऑब्जेक्ट
- 8. ऑन न्यूइन्टेंट (इरादा उद्देश्य) विधि दो बार क्यों बुला रही है?
- 9. डब्ल्यूसीएफ विधि दो बार
- 10. हम मूल्य प्रकार को क्यों लॉक नहीं कर सकते?
- 11. आप विस्तार विधियों को सीधे क्यों नहीं बुला सकते हैं?
- 12. क्यों दो बार
- 13. productsRequest प्रतिक्रिया विधि बुला नहीं है
- 14. जावा में स्थिर विधि बुला
- 15. लिनक्स पर, विनाशक C++ में वैश्विक चर के साझा उदाहरण पर दो बार क्यों चलाता है?
- 16. उसी पंक्ति पर दो चर शुरू करें
- 17. पायथन बोतल प्रारंभिक विधि को दो बार
- 18. क्यों execorService.shutdownNow विधि थ्रेड
- 19. थ्रेड। स्टार्ट() बनाम BackgroundWorker
- 20. @PostConstruct विधि को उसी अनुरोध के लिए दो बार बुलाया जाता है
- 21. सी # हम स्थिर संपत्ति को ओवरराइड क्यों नहीं कर सकते?
- 22. ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं है।
- 23. "ऑब्जेक्ट रेफरेंस ऑब्जेक्ट के उदाहरण पर सेट नहीं है" सूची
- 24. हम नेविगेशन बार
- 25. हम सी # में एनम उदाहरण से enum मानों का उपयोग क्यों नहीं कर सकते?
- 26. उसी पृष्ठ पर दो jQuery संस्करण
- 27. Uncaught त्रुटि: NPObject पर त्रुटि बुला विधि
- 28. क्यों की जरूरत नहीं वर्ग के आयात किया जाता है जब उदाहरण पर विधि (जावा)
- 29. हम एक स्थिर विधि
- 30. हम इटरेटर को क्यों नहीं ले जा सकते थे?
अच्छा सवाल - मैं हमेशा पूछे बिना दस्तावेज़ों का अंधाधुंध पालन करता हूं। +1 –
यदि आपको एक ही चीज़ को एकाधिक थ्रेड में करने की आवश्यकता है, तो आप रननेबल को कार्यान्वित कर सकते हैं और थ्रेड क्लास के कई उदाहरणों के लिए एक ही रननेबल को पास कर सकते हैं। – Yishai
@Yishai, हाँ आप संस्कार कर रहे हैं, लेकिन एक ही थ्रेड उदाहरण पर क्यों नहीं? – GuruKulki