रोकना मेरे लिए यह एक मामला हो सकता है जो मैंने पढ़ा है, लेकिन जावा में धागे को मारने के लिए सभी उदाहरण यह इंगित करते हैं कि आपको खुद को मारने के लिए धागे को सिग्नल करना है; आप बिना किसी गंभीर जोखिम के बाहर से इसे मार नहीं सकते हैं। समस्या यह है कि, "विनम्रतापूर्वक" मरने के लिए एक धागे से पूछने के सभी उदाहरणों में कुछ प्रकार के लूपिंग होते हैं, इसलिए आपको बस इतना करना है कि प्रत्येक पुनरावृत्ति पर ध्वज देखें।एक गैर-लूपिंग जावा थ्रेड
तो, मुझे जो मिला है वह एक थ्रेड है जो कुछ ऐसा करता है जो कुछ समय लेता है (SQL क्वेरी की एक श्रृंखला)। मेरे लिए निश्चित रूप से प्रत्येक चरण के बाद जांच करना संभव है, लेकिन वे एक लूप में नहीं हैं और एक बहुत ही सुरुचिपूर्ण तरीका नहीं है जिसे मैं इसके बारे में जानने के बारे में जानता हूं। यहाँ मैं क्या कर रहा हूं, इसका एक उदाहरण:
new Thread(new Runnable(){
public void run(){
//query 1
Connection conn = db.getConnection();
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT ...");
while(rs.next()){
//do stuff
}
//query 2
rs = s.executeQuery("SELECT ...");
while(rs.next()){
//do stuff
}
//query 3
rs = s.executeQuery("SELECT ...");
while(rs.next()){
//do stuff
}
}
}).start();
यह एक उदाहरण है, मैं गुमनाम इनर क्लासों का उपयोग नहीं करते लेकिन यह दिखाता है कि मेरी रन() विधि सुंदर ढंग से खुद को नहीं रोक सकता। फ़्यूथरमोर, यहां तक कि मैं प्रत्येक चरण के बाद भी जांच करता हूं, यदि किसी विशेष क्वेरी को चलाने में बहुत लंबा समय लगता है, तो यह कोड पूरा होने के बाद तक यह कोड रुकने में सक्षम नहीं होगा।
यह कोड एक जीयूआई अनुप्रयोग के लिए है, और मैं वास्तव में Thread.stop() का उपयोग किए बिना थ्रेड को मारने का एक अच्छा तरीका खोजना चाहता हूं।
EDIT - यशवित का जवाब एक बड़ी मदद थी, क्योंकि मुझे पता नहीं था कि Statement.cancel()
मौजूद था। यदि आप उत्सुक हैं, तो मेरी विशेष समस्या का उत्तर एक अधिक सारणित डेटाबेस एक्सेस क्लास बनाना था। कक्षा को चलने के दौरान क्वेरी और लूप निष्पादित करने के लिए एक बच्चे धागा बनाना था, अगर मौजूदा धागा (बच्चा नहीं) बाधित हो तो प्रत्येक पुनरावृत्ति पर जांच कर रहा था। यदि यह बाधित हो जाता है, तो यह सिर्फ स्टेटमेंट.cancel() को कॉल करता है और बाल धागा अपवाद फेंक देगा और मर जाएगा। सभी जेडीबीसी ड्राइवर Statement.cancel()
का समर्थन नहीं करते हैं, लेकिन ओरेकल 11 जी करता है।
संभव डुप्लिकेट [जावा में तेज और साफ तरीके से धागे को कैसे रोकें?] (Http://stackoverflow.com/questions/94011/how-to-abort-a-thread-in-a-fast -और-क्लीन-वे-इन-जावा) –
आपको अस्थिर बूलियन सेट करने और इसे जांचने की आवश्यकता है, या यह देखने के लिए जांचें कि क्या थ्रेड बाधित हो गया है (और इसे बंद करने के कारण इसे किसी अन्य थ्रेड से बाधित करें)। –