2011-03-09 7 views
6

मैं तुरंत जावा थ्रेड को रोकना चाहता हूं लेकिन जब मैं थ्रेड का प्रयास करता हूं तो हमेशा रोकने से पहले कुछ समय लगता है। क्या जावा थ्रेड को तुरंत रोकने के लिए मजबूर करने का कोई अच्छा तरीका है?जावा थ्रेड को मजबूती से रोकने के लिए कोई अच्छा तरीका है?

+0

आवश्यकता पर निर्भर करता है। खैर, आप तुरंत इंटरप्ट() –

+0

@ मोहम्मद साल्घ का उपयोग कर रोक सकते हैं: मैं इसका उपयोग कर रहा हूं। लेकिन यह धागा को रोकने के लिए समय ले रहा है। मैं अपने सर्वर कंसोल पर उस प्रक्रिया को देख सकता हूं। –

+0

कृपया नीचे दिए गए उत्तर की तलाश करें .. –

उत्तर

3

रनिंग थ्रेड Thread.Interrupt का उपयोग करके बंद नहीं किया जा सकता है, केवल Thread.Interrupt का उपयोग करके धागे को रोक या अवरुद्ध कर दिया जा सकता है। लेकिन एक साझा चर का उपयोग करके यह संकेत मिलता है कि यह क्या करना है इसे रोकना चाहिए। थ्रेड को आवधिक रूप से चर की जांच करनी चाहिए, (उदा: थोड़ी देर लूप का उपयोग करें) और व्यवस्थित ढंग से बाहर निकलें।

private boolean isExit= false; 

public void beforeExit() { 
    isExit= true; 
} 

public void run() { 
    while (!isExit) { 

    } 
} 
12

तुरंत थ्रेड को रोकने का कोई अच्छा तरीका नहीं है।

  • Thread.stop() है, लेकिन यह खतरनाक और बहिष्कृत है। यह प्रयोग न करें जब तक कि:

    1. आप पूरी तरह से समस्याओं को समझने, और

    2. आप है अच्छी तरह से अपने कोड का विश्लेषण किया और निर्धारित किया है कि समस्याओं लागू नहीं है और/या जोखिम स्वीकार्य हैं।

  • वहाँ Thread.interrupt() है, लेकिन कोई गारंटी नहीं कि धागा जल्दी से बंद हो जाएगा, या यहाँ तक सब पर रोक नहीं है।

  • समय-समय पर ध्वज की जांच करने के लिए थ्रेड लिखने का दृष्टिकोण है, लेकिन यदि ध्वज अक्सर जांच नहीं किया जाता है (दुर्घटना या डिज़ाइन द्वारा), तो थ्रेड जल्दी से नहीं रुक जाएगा।


Fwiw, झंडा और interrupt() दृष्टिकोण मूलतः एक ही हैं। दोनों मामलों में, जो धागा बाधित होने की अपेक्षा करता है उसे नियमित रूप से जांचने की आवश्यकता होती है; जैसे interrupted() या isInterrupted() पर कॉल करके या ध्वज की जांच करके। अंतर यह है कि interrupt() तंत्र काम करेगा जब कोड notify() या अवरुद्ध और आईओ ऑपरेशन के लिए प्रतीक्षा कर रहा है। इसकी वजह से, और क्योंकि interrupt ऐसा करने का एक स्वतंत्र तरीका है, इसे किसी एप्लिकेशन विशिष्ट तंत्र की वरीयता में उपयोग किया जाना चाहिए।

+0

अतिरिक्त रूप से यदि आप जावा इंफ्रास्ट्रक्चर का उपयोग करके ध्वज विधि का उपयोग करना चाहते हैं तो आप 'Thread.currentThread.isInterrupted' का उपयोग कर सकते हैं। – sixtyfootersdude

+0

@sixtyfootersdude - मुझे विश्वास है कि मैंने पहले ही कहा है। –

1

किसी भी परिस्थिति में थ्रेड.स्टॉप का उपयोग न करें - अगर आप यह सवाल पूछ रहे हैं तो आप जावा थ्रेडिंग मॉडल को सुरक्षित रूप से उपयोग करने के लिए पर्याप्त नहीं समझते हैं।

विवरण

, उत्सुक के लिए, यहां हैं: http://download.java.net/jdk7/archive/b131/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

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

थ्रेड.स्टॉप का उपयोग न करें। कभी।

+0

मैं लगभग लिंक पर Thread.stop() thx का उपयोग करने की अनुमति दे रहा था! –

4

एक अच्छा तरीका को सुरक्षित रूप से (और जल्दी) बल एक धागा रोक नहीं है:

System.exit(0) 

दुर्भाग्य से, यह अन्य सभी धागे की हत्या के पक्ष प्रभाव है।

+17

पावर कॉर्ड को खींचकर भी काम करता है :-) –

+0

हालांकि मैं आपके डेटा सेंटर पर ऐसा करने की अनुशंसा नहीं करता हूं :-) –

+1

यह एक बुरा जवाब है, यह मेरे सभी धागे को मार देता है !!! – HDJEMAI

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