2012-10-31 17 views
8

मैं वास्तव में धागे को मारने का एक आसान तरीका ढूंढ रहा हूं इससे कोई फर्क नहीं पड़ता कि धागा कहाँ चल रहा है। लेकिन इंटरनेट में अधिकांश समाधान मुझे थ्रेड के निष्पादन को नियंत्रित करने के लिए बुलियन ध्वज का उपयोग करने के लिए इंगित करते हैं, अगर मैं थ्रेड को रोकना चाहता हूं तो बूलियन चर को झूठी पर सेट करें।जावा थ्रेड.स्टॉप() कैसे काम करते हैं?

लेकिन क्या होगा यदि चलने योग्य कार्य एक लंबा रैखिक कार्य है, जिसका अर्थ है कि कार्य दोहराना नहीं है? उस स्थिति में, कार्य के पूरे ब्लॉक को कवर करने के लिए 'थोड़ी देर' लूप बनाना इतना आसान नहीं है।

यह थ्रेड.स्टॉप का उपयोग करने के लिए वास्तव में बहुत ही आकर्षक है लेकिन चेतावनी "बहिष्कृत" उपयोग करने के लिए काफी खतरनाक प्रतीत होता है। मैं इस लेख Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?

के माध्यम से पढ़ा है, लेकिन मैं

नहीं समझ सकता वस्तुओं पहले से इन पर नज़र रखता है में एक असंगत स्थिति थे द्वारा संरक्षित के किसी भी अन्य धागे अब एक में इन वस्तुओं को देख सकते हैं, तो असंगत स्थिति। ऐसी वस्तुओं को क्षतिग्रस्त कहा जाता है।

क्या "असंगत स्थिति" क्या मतलब है? अगर कोई इस बारे में समझा सकता है तो मैं सराहना करता हूं।

मैं देखने के एक अधिक निचले स्तर के लिए मेरे सवाल का विस्तार करना चाहते हैं, का कहना है कि JVM (शायद विधानसभा भाषा को समान रूप से), हो सकता है यह जावा बयान, कुछ छोटे निर्देश में विभाजित किया जाएगा move i ; add i ; get i into memory 0x0101 की तरह (उदाहरण के लिए में i = i + 1; यह एक है चलो उदाहरण! मैं पूरी तरह से असेंबली भाषा नहीं जानता!)

अब, अगर हम थ्रेड.स्टॉप कहते हैं, तो वास्तव में यह कहां रुक जाएगा? क्या एक पूर्ण जावा कथन के बाद थ्रेड रुक जाएगा, या "भाषा इकट्ठा" के बीच में हो सकता है? यदि उत्तर दूसरा है, तो यह कारण हो सकता है कि हमने कहा कि

ऐसी वस्तुओं को क्षतिग्रस्त माना जाता है।

?

ठीक है, मेरा प्रश्न उलझन में है, उम्मीद है कि कोई समझ और समझा सकता है। अग्रिम में धन्यवाद।

+0

संबंधित प्रश्न http://stackoverflow.com/questions/7291914/java-stop-safety-a-thread-not-using-while-and-boolean-flag –

उत्तर

3

"असंगत स्थिति" डेटा के राज्य के रूप में अपने आवेदन, राज्य है कि आपके आवेदन तर्क ध्यान से ताले/मॉनिटर आदि के साथ अपने आवेदन धागे की सुरक्षित बनाने के द्वारा उत्पादन किया है के बारे में परवाह करता है इसका मतलब है

कल्पना कीजिए कि आप इस सरल विधि है :

public synchronized void doSomething() 
{ 
     count++; 
     average = count/total; 
} 

यह विधि, अन्य विधियों के साथ सिंक्रनाइज़ होती है, क्योंकि एकाधिक थ्रेड इस ऑब्जेक्ट का उपयोग कर रहे हैं। शायद वहाँ एक

public synchronized AverageAndCount getMeasurement() 
{ 
    return new AverageAndCount(average, count); 
} 

यह भरोसा दिलाते हैं कि एक धागा, एक अधूरी माप नहीं पढ़ सकते है अर्थात वर्तमान माप उदा अंदर गणना की जा रही करने की प्रक्रिया में है अगर doSomething(), getMeasurement() समाप्त होने तक ब्लॉक/प्रतीक्षा करेगा।

अब, कल्पना करें कि थ्रेड में कुछ चल रहा है, और आप उस थ्रेड पर .stop() पर कॉल करते हैं।

तो धागा बंद कर दिया जा सकता है सही होने के बाद यह count++; करता है, की निगरानी है कि आयोजित है अनलॉक हो और विधि समाप्त हो जाता है और average = count/total; निष्पादित नहीं है,

डेटा इसका मतलब है कि अब असंगत है। किसी भी व्यक्ति को मिलने के लिए माप() बाद में असंगत डेटा मिलेगा।

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

5

"क्षतिग्रस्त वस्तु" एक उच्च स्तरीय अवधारणा है, यह JVM स्तर पर नहीं होती है। एक प्रोग्रामर ताले के साथ महत्वपूर्ण वर्गों की रक्षा करके अपनी कक्षा को थ्रेड सुरक्षा के साथ डिजाइन करता है। यह उनकी कक्षा का एक आविष्कार है कि प्रत्येक महत्वपूर्ण खंड या तो पूर्ण रूप से चलता है, या बिल्कुल नहीं चलता है। जब आप stop धागे होते हैं, तो मध्य में एक महत्वपूर्ण खंड बाधित हो सकता है, इसलिए आविष्कार को बाधित कर दिया जा सकता है। उस समय वस्तु क्षतिग्रस्त है।

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

अभ्यास में, जब भी एक विदेशी कोड जबरदस्ती निरस्त किया जा करने के लिए, यह एक अलग प्रक्रिया से किया जाना चाहिए, क्योंकि एक प्रक्रिया की हत्या में कम से कम ओएस स्तरीय सफाई करता है और एक बहुत अच्छा करता है की आवश्यकता हो सकती है कि चलाने की जरूरत का सामना कर रहा नुकसान युक्त नौकरी।

2

मैं कोई विशेषज्ञ नहीं हूं लेकिन यह मुझे लगता है। यदि आप Thread.stop() का उपयोग करते हैं तो आप ThreadDeath अपवाद का कारण बनते हैं जो सभी मॉनीटर को रिहा कर देगा। चूंकि आप अपवाद को उकसाते हैं, आप चीजों की स्थिति में एक अप्राकृतिक व्यवहार लागू कर रहे हैं।

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

2

मेरा मानना ​​है कि चिंता यह है कि थ्रेड किसी ऑब्जेक्ट के सदस्यों को बहु-चरण अपडेट करने वाले सिंक्रनाइज़ ब्लॉक के बीच में हो सकता है। अगर थ्रेड अचानक बंद हो जाता है, तो कुछ अपडेट हुए होंगे लेकिन अन्य नहीं और अब ऑब्जेक्ट का राज्य इसे अनुपयोगी प्रस्तुत कर सकता है।

मुझे संदेह है कि थ्रेडडिथ हैंडलिंग AbstractQueuedSynchronizer द्वारा समर्थित है जो एप्लिकेशन को डेडलॉक के रास्ते पर छोड़ सकता है।

कोड के अपने लंबे अनुक्रम में किसी भी तार्किक बिंदु पर आप बस जोड़ सकते हैं:

if (Thread.interrupted()) { 
    throw new InterruptedException(); 
} 

... इस इस बिंदु पर निष्पादन बाहर निकल जाएगा अगर यह निर्धारित किया जाता है कि Thread.interupt()Thread लंबे को क्रियान्वित करने पर बुलाया गया था चल रहा कार्य

-1

यह स्पष्ट रास्ता thread.actually पदावनत बंद() विधि को रोकने के लिए जब भी नहीं चला है() विधि पूरा हो गया है या किसी अपवाद तो धागा stop.by बूलियन ध्वज चर .Bydefault "गलत"

उपयोग कर रहा है हुआ है
संबंधित मुद्दे