2009-12-04 15 views
8

मैं डेडलॉक राज्य में फंस गए धागे को मारना चाहता हूं। सबसे पहले, हम ThreadMXBean कक्षा java.lang.management में विधि का उपयोग कर detect thread ids in deadlock state कर सकते हैं।जावा में deadlocked धागे को कैसे मारने के लिए?

फिर, मैं थ्रेड को थ्रेड आईडी से मारना चाहता हूं, और इस प्रकार मेरे पास दो संबंधित प्रश्न हैं:
(1) थ्रेड आईडी द्वारा थ्रेड का नियंत्रण कैसे प्राप्त करें?
(2) अवरुद्ध धागे को कैसे मारें? मुझे लगता है कि अवरोध() विधि invokting धागे को अपवाद देगा और धागे को मार डालेगा।

+3

कोड को ठीक करना ताकि धागे पहले स्थान पर डेडलॉक न करें जो आप करने की कोशिश कर रहे हैं। – Chris

+0

क्रिस की तरह मैंने कहा कि मुझे लगता है कि आपको पहले स्थान पर डेडलॉक्स से बचने के लिए एक योजना तैयार करनी चाहिए। – Alfred

+1

जो भी आप चाहते हैं उसे करने का एकमात्र उचित तरीका System.exit() ... और मैं केवल आंशिक रूप से मजाक कर रहा हूं। – PSpeed

उत्तर

3

रूट थ्रेड ग्रुप से, आप थ्रेड क्लास enumerate all running threads प्राप्त कर सकते हैं। फिर आप अपनी आईडी से मेल खाने वाले थ्रेड.स्टॉप पर कॉल कर सकते हैं।

ऐसा कहकर, यह एक असंगत स्थिति में वस्तुओं को छोड़ने की संभावना के कारण अत्यधिक खतरनाक है। मुझे विश्वास नहीं है कि इंटरप्ट विधि एक थ्रेड को मुक्त कर देगा जो एक सिंक्रनाइज़ेशन लॉक पर प्रतीक्षा में फंस गया है, इसलिए (बुराई) विधियों को रोकें

यह भी देखें: "Java Thread Primitive Deprecation"।

+3

इस की बुराई पर जोर नहीं दिया जा सकता है। पहली जगह में डेडलॉक से बचने के लिए कोड लिखना बेहतर है। – bmargulies

+0

सभी चल रहे धागे का आकलन करना एक दिलचस्प लेख है, इसलिए मैं निश्चित रूप से बाद में इसका उपयोग करूंगा। धन्यवाद। – Sangmin

+1

Thread.stop() दृष्टिकोण जावा 1.5 में काम नहीं कर रहा है। मृतक धागे अवरुद्ध राज्य में रहते हैं। मेरे लिए, मैं डेडलॉक डिटेक्टर के लिए यूनिट टेस्ट लिखने की कोशिश कर रहा हूं और मैं अपने जानबूझकर-डेडलॉक थ्रेड्स से छुटकारा नहीं पा सकता हूं! अंतिम वाक्य के लिए :-) –

6

java.util.concurrent.Lock.lockInterruptibly() विधि बाधित है, कहीं अधिक सामान्य सिंक्रनाइज़ लॉकिंग नहीं है। जैसा कि दस्तावेज में उल्लिखित है, डेडलॉक थ्रेड्स को गिनने की क्षमता एक डिबगिंग सहायता के रूप में है, न कि उत्पादन वातावरण में पुनर्प्राप्त करने के साधन के रूप में।

उत्पादन में यह पूरी प्रक्रिया से बाहर निकलने और फिर से शुरू करने के लिए शायद सुरक्षित है।

+1

+1 –

2

यहां तक ​​कि Thread.stop() आंतरिक लॉक पर थ्रेड को थ्रेडलॉक करने में असमर्थ है। If a thread is blocked waiting for an intrinsic lock, there is nothing you can do to stop it short of ensuring that it eventually acquires the lock and makes enough progress that you can get its attention some other way. यह लॉक.लॉक() के माध्यम से काम करता है।

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