2012-03-11 23 views
7

बच्चे धागे पूर्ण निष्पादन से पहले मुख्य धागा बाहर निकलेंगे?बच्चे धागे पूर्ण निष्पादन से पहले मुख्य धागा निकास होगा?

मैं 2 लेख

http://www.cs.mtu.edu/~shene/NSF-3/e-Book/FUNDAMENTALS/thread-management.html

उपरोक्त लेख में

में पढ़ा है, में "थ्रेड समाप्ति" पैरा, यह लाल रंग में कहा गया है, "अगर माता-पिता धागा समाप्त हो जाता है, अपने बच्चे को धागे के सभी के साथ-साथ समाप्त। "

http://www.roseindia.net/java/thread/overview-of-thread.shtml

उपरोक्त लेख में

, उस पृष्ठ राज्यों में अंतिम पंक्ति "main() प्रणाली निष्पादन समाप्त कर सकते हैं, लेकिन जब तक सभी धागे इसके निष्पादन को पूरा किया है कार्यक्रम चलते रहेंगे।"।

मैं शुल्क वे विरोधाभासी हैं। अगर मैं गलत हूं, तो कृपया विशेषज्ञ मुझे सही करें।

मेरे कार्यक्रम में, मुख्य विधि वाला एक प्रोग्राम 2 थ्रेड के निर्माता को कॉल करता है। संबंधित धागे के निर्माता में, मुझे प्रारंभ() विधि है।

 TestA A = new TestA("TestA"); 
    TestB B = new TestB("TestB"); 

    public TestA(String name) { 
    System.out.println(name); 
    t = new Thread(this); 
    t.start(); 
} 

मैं जानना चाहता हूं कि क्या होता है, मुख्य धागा बाल धागे पूर्ण निष्पादन से पहले समाप्त हो जाता है? यदि हां, तो क्या बच्चे के धागे वैसे भी होंगे, उनके निष्पादन को जारी रखें ??

मैंने प्रोग्राम चलाने की कोशिश की, कुछ बार सभी थ्रेड थ्रेड निष्पादित हो रहे हैं भले ही मुख्य थ्रेड निकल जाए। 2 धागे में, मैं कुछ फ़ाइलों को संसाधित कर रहा हूं। testA धागा में अकेले, अकेले 1 फ़ाइल कुछ बार संसाधित नहीं हो रही है। लेकिन कई बार, सभी फाइलें संसाधित हो रही हैं और मुझे कोई समस्या नहीं है।

उत्तर

20

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

जब आपकी मुख्य() विधि प्रारंभ में जावा रनटाइम से नियंत्रण प्राप्त करती है, तो यह उपयोगकर्ता थ्रेड के संदर्भ में निष्पादित होती है। जब तक मुख्य विधि धागा या कोई अन्य उपयोगकर्ता धागा जीवित रहता है, तब तक आपका आवेदन निष्पादित करना जारी रहेगा।

आपके मामले में, धागे उपयोगकर्ता धागे हैं और इसलिए मुख्य थ्रेड से बाहर होने से पहले पूरा होने की अनुमति है।

मैं कुछ फ़ाइलों को संसाधित कर रहा हूं। टेस्ट ए थ्रेड ए अकेले, अकेले 1 फ़ाइल कुछ बार संसाधित नहीं हो रही है। लेकिन कई बार

उपर्युक्त कारण थ्रेड निकास से कुछ और हो सकता है।

एक जावा वर्चुअल मशीन शुरू होता है, वहां आम तौर पर एक भी गैर डेमॉन धागा (जो आमतौर पर विधि का मुख्य नामित कहता है: यह फ़ाइल ताले, तुल्यकालन मुद्दे आदि

Java Thread API documentation से हो सकता है कुछ नामित कक्षा)।जावा वर्चुअल मशीन थ्रेड निष्पादित करती है जब तक कि निम्न में से कोई भी न हो:

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

+0

विस्तृत स्पष्टीकरण के लिए धन्यवाद। आपने उल्लेख किया है कि "आपके मामले में, धागे उपयोगकर्ता धागे हैं और इसलिए मुख्य थ्रेड से बाहर होने से पहले पूरा करने की अनुमति है।" यहां आप जावा रन टाइम होने के लिए "मुख्य धागा" का अर्थ मुख्य विधि() के साथ प्रोग्राम नहीं है। सही बात? – user1257836

+0

जिस वर्ग में मुख्य विधि है और मुख्य विधि के अंदर बनाए गए धागे सभी उपयोगकर्ता धागे हैं। ये सभी धागे स्वतंत्र रूप से निष्पादित होते हैं। क्योंकि मैंने System.out.println ("मुख्य विधि से बाहर निकलें") दिया है; मुख्य विधि के अंत में। यह बच्चे धागे में system.out.println() से पहले मुद्रित हो जाता है। इससे मुझे लगता है कि मुख्य धागा (कक्षा जिसमें मुख्य विधि है) बच्चे के धागे से पहले भी बाहर निकल सकती है। व्यवहार का यह सही और सही तरीका है? – user1257836

+0

क्या आप कृपया स्पष्टीकरण दे सकते हैं कि फाइल लॉक से आपका क्या मतलब है? अग्रिम में धन्यवाद!! – user1257836

2

एक बार जब मुख्य धागा निकलता है, तो यह बच्चों को इसके साथ ले जाता है। शायद दूसरे लेख को "खत्म" करके बस बच्चों के लिए इंतजार करने के अलावा कोई और ऑपरेशन नहीं है। एक बार मुख्य धागा System.exit (0) को कॉल करता है; यह खत्म हो गया है - हर शरीर मर जाता है।

कहें कि आपके पास दो धागे चल रहे हैं: थ्रेडए और थ्रेड बी। मुख्य विधि में। पहले कोड धागा समाप्त अच्छा तरीका है - बस कई तरीकों में से एक:

threadA.start(); 
threadB.start(); 
final long intercept = 300; 
long startTime = System.currentTimeMillis(); 
while (threadA.isAlive() && mis.isAlive()) { 
    threadA.join(intercept); 
if (System.currentTimeMillis() - startTime > intercept) { 
    threadB.interrupt(); 
    threadA.interrupt(); 
    threadA.join(); 
} 
} 
System.exit(0); 

नीचे मुख्य भीतर से सभी धागे की हत्या के अचानक तरीका है:

System.exit(0); 
+0

प्रतिक्रिया के लिए धन्यवाद। मैंने अपने प्रोग्राम में System.exit (0) का कभी भी उपयोग नहीं किया। "एक बार मुख्य धागा निकलता है, यह बच्चों को इसके साथ ले जाता है" .am अभी भी स्पष्ट नहीं है। कार्यक्रम जिसमें मुख्य विधि है 2 धागे बनाता है और यह पूरा हो जाता है।लेकिन पैदा हुए बच्चे धागे जारी रहेगा, क्या यह सही नहीं है? – user1257836

3

पृष्ठभूमि धागे होगा चलते रहें, भले ही मुख्य धागा पूरा हो।

यदि आप उन्हें रोकने के लिए मुख्य चाहते हैं (उदाहरण के लिए, जब मुख्य पूरा हो जाता है), तो अपने मुख्य सेट को "चलने" फ्लैग वैरिएबल सेट करें (जिसे आपको "अस्थिर" के रूप में सेट करना होगा), जो धागे कभी-कभी देखे जाते हैं। मुख्य इसे गलत (परिवर्तनीय) या शून्य (ऑब्जेक्ट) पर सेट करता है जब MAIN उन्हें रोकना चाहता है। जब यह झूठी या शून्य है, तो थ्रेड को "वापसी" होना चाहिए।

यह लागू करने के लिए कुछ जटिल है, कई तरीके हैं, लेकिन आपके रननेबल को एक आंतरिक वर्ग बनाना आसान है, ताकि आपके रननेबल को ध्वज का आसान साझाकरण हो।

सर्वोत्तम कार्यान्वयन के लिए, जावा एप्लेट्स की स्टार्ट/स्टॉप रूटीन में इस तकनीक को देखें।

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