2014-04-26 12 views
18

जावा 8 के तहत रोकने के लिए Thread को मजबूर करने का कोई तरीका है, अब Thread.stop हटा दिया गया है? इसमें लॉक/सिंक्रनाइज़/नींद/प्रतीक्षा/अनंत लूप रोकने के लिए प्रतीक्षा थ्रेड को मजबूर करना शामिल है। जबकि वहाँ की प्रबल संभावना है -जावा 8 में Thread.stop() के लिए वैकल्पिक?

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

लॉक अप थ्रेड को रोकने के बिना इस जानकारी को सहेजने का प्रयास करना असंभव है, क्योंकि इसे सहेजने के लिए इसे ताले हासिल करने की आवश्यकता होगी।

+1

क्या आप इसे [शटडाउन हुक] (http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html# के साथ कर सकते हैं addShutdownHook% 28java.lang.Thread% 29) एक वीएम के भीतर गलत व्यवहार धागे की पहचान करने की कोशिश करने के बजाय एक सिगक्विट के जवाब में कोर डंप करने के लिए? –

+4

मेरा मतलब है, वास्तविक जवाब यह है: कोड को ठीक करें जो समस्याएं पैदा कर रहा है जिससे आपको धागे को मारने की आवश्यकता होती है। –

+3

'थ्रेड.स्टॉप' हटा दिया गया था? क्या अच्छी खबर है, यह कभी भी सबसे भयानक, बेकार तरीकों में से एक था। आपके मामले में: कोई भी डेटा को सहेजते समय ताले हासिल करने के लिए मजबूर नहीं कर सकता है - इसके लिए आपको कुछ निश्चित रूप से प्रतिक्रिया करने की आवश्यकता होगी और यह स्पष्ट रूप से त्रुटि प्रवण है, लेकिन फिर आप जो करने की कोशिश कर रहे हैं उसमें एक अंतर्निहित समस्या है। – Voo

उत्तर

6

तुम सच में एक Thread मुश्किल तरीके से आप विचार कर सकते हैं कि विधि Thread.stop() (एक मनमाना Throwable प्रदान किए बिना) अभी भी जावा 8. साथ काम करता है यह बंद कर दिया धागा है जो किसी भी तरह से संभाला जा सकता पर एक ThreadDeath उत्पन्न होगा रोकने के लिए की जरूरत है इसके असामान्य नाम के बावजूद अन्य Error। केवल अंतर यह है कि ThreadDeath पकड़ा नहीं गया है, तो कोई स्टैक ट्रेस मुद्रित नहीं किया जाएगा।


लेकिन सावधान रहना है कि इस विधि अन्य stop विधि की तुलना में एक ही कारण के अधिकांश के लिए मान्य नहीं है। यह जावा की अगली रिलीज में से एक में असमर्थित हो सकता है।तो अभी भी एक योजना बी के बारे में सोचने का समय है ...

+0

वास्तव में प्रश्न का उत्तर देने के लिए धन्यवाद: डी मैंने दस्तावेज़ों को गलत समझा था और सोचा था कि दोनों .स्टॉप (थ्रोबल) और .stop() को हटाकर, मेरे कोड के बाद .stop (थ्रोबल) तोड़ दिया गया था। –

+0

दुर्भाग्यवश एपीआई परिवर्तन बिल्कुल दस्तावेज नहीं है --- यह पहले जैसा ही "बहिष्कृत" कहता है। 'UnsupporteOperationException' का कोई उल्लेख नहीं है –

+1

ठीक है, [इसे अनदेखा करना आसान है] (http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#stop-java.lang.Throwable-) लेकिन अंत में पूरे विवरण में ' छोटा वाक्यांश * असमर्थित ऑपरेशन अपवाद * फेंकता है। – Holger

0

धागे को रोकने का सही तरीका interrupt पर कॉल करना है।

+5

यह ध्यान दिया जाना चाहिए कि यह 'Thread.stop()' को कॉल करने के समान ही नहीं है। 'इंटरप्ट' का उपयोग करना मानता है कि धागे में किए गए काम को अच्छी तरह से व्यवहार और अंतःस्थापित किया जाता है। ऐसा कोई मामला नहीं है जितना कि 'इनपुटस्ट्रीम' पर अवरुद्ध करने जैसा सरल है, और इस प्रकार वॉचडॉग के लिए पर्याप्त संभावना नहीं है। –

+0

@ मार्कपाइटर मैंने यह नहीं कहा कि यह कॉलिंग स्टॉप जैसा ही है। मैंने कहा कि यह एक थ्रेड को रोकने/मारने के लिए सही तरीका है (इसे अपनी इच्छानुसार नाम दें)। –

+3

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

7

इन लेख पढ़ें, वे इसे समझाने:

  1. "क्यों कर रहे हैं Thread.stop, Thread.suspend, Thread.resume और Runtime.runFinalizersOnExit पदावनत" http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

  2. यहोशू बलोच: "प्रभावी जावा (2 संस्करण)", मद 66:

    :

यहोशू बलोच बताते हैं कि कैसे एक धागा बंद करो और यह कहते हैं करने के लिए साझा परिवर्तनशील डेटा तक पहुँच सिंक्रनाइज़

किसी अन्य थ्रेड को रोकने से रोकने के कार्य पर विचार करें। पुस्तकालय थ्रेड.स्टॉप विधि प्रदान करते हैं, लेकिन इस विधि को लंबे समय तक पहले बहिष्कृत किया गया था क्योंकि यह स्वाभाविक रूप से असुरक्षित है - इसका उपयोग डेटा भ्रष्टाचार के परिणामस्वरूप हो सकता है। Thread.stop का उपयोग न करें। एक थ्रेड को रोकने के लिए एक अनुशंसित तरीका है कि पहले धागे को बूलियन फ़ील्ड पर प्रारंभ करना है जो प्रारंभ में झूठा है लेकिन दूसरे थ्रेड द्वारा पर सत्य पर सेट किया जा सकता है, यह इंगित करता है कि पहला धागा स्वयं को रोकना है।

इस तकनीक का उपयोग करते समय आपको बूलियन क्षेत्र के सिंक्रनाइज़ेशन को भी संभालना चाहिए। मैं जोशुआ ब्लोच की किताब से बहुत अधिक चीजों की प्रतिलिपि नहीं लेना चाहता हूं, लेकिन आपको उपरोक्त वर्णित आधिकारिक ओरेकल जावा दस्तावेज में और सबकुछ मिल जाएगा।

+1

आपको किसी भी राज्य में थ्रेड रोकने में कठिनाई होगी। एफवाईआई –

+0

ओरेकल डॉक्टर का वर्णन है कि मैं सभी मुख्य मामलों को सोचता हूं। 'इंटरप्ट' का उपयोग कैसे करें और कब करें। –

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