मैं उम्मीद होती है कि JVM शान से व्यवधान आवेदन द्वारा बनाई (thread.interrupt()
) चल रहे सभी धागे, कम से कम संकेत SIGINT (kill -2)
और SIGTERM (kill -15)
के लिए।
इस तरह, सिग्नल उन्हें अग्रेषित किया जाएगा, standard ways में एक शानदार थ्रेड रद्दीकरण और संसाधन अंतिम रूप देने की इजाजत दी जाएगी।
लेकिन इस मामले (कम से कम मेरी JVM कार्यान्वयन में नहीं है:।। Java(TM) SE Runtime Environment (build 1.8.0_25-b17), Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
के रूप में अन्य उपयोगकर्ताओं ने टिप्पणी की, बंद हुक के उपयोग अनिवार्य लगता है
तो, मैं कैसे करना है इसे संभाल लेंगे?
सबसे पहले, मुझे सभी कार्यक्रमों में इसकी परवाह नहीं है, केवल उन जगहों पर जहां मैं उपयोगकर्ता रद्दीकरण और अप्रत्याशित सिरों का ट्रैक रखना चाहता हूं। उदाहरण के लिए, कल्पना करें कि आपका जावा प्रोग्राम एक प्रक्रिया आदमी है दूसरे द्वारा वृद्ध आप अलग-अलग करना चाहते हैं कि इसे प्रबंधक प्रक्रिया से SIGTERM
) को बंद कर दिया गया है या शट डाउन हुआ है (स्टार्टअप पर स्वचालित रूप से नौकरी को फिर से लॉन्च करने के लिए)।
आधार के आधार पर, मैं हमेशा अपने लंबे समय से चलने वाले थ्रेड को बाधित स्थिति के बारे में जागरूक करता हूं और InterruptedException
फेंक देता हूं यदि वे बाधित होते हैं। यह डेवलपर द्वारा नियंत्रित तरीके से निष्पादन अंतिम रूप को सक्षम बनाता है (मानक अवरोधन संचालन के समान परिणाम भी उत्पन्न करता है)। फिर, थ्रेड स्टैक के शीर्ष स्तर पर, InterruptedException
कैप्चर किया गया है और उचित क्लीन-अप किया गया है। इन धागे को एक बाधा अनुरोध का जवाब देने के लिए जाना जाता है। उच्च cohesion डिजाइन।
तो, इन मामलों में, मैं एक बंद हुक, करता है कि मैं क्या सोचता JVM डिफ़ॉल्ट रूप से करना चाहिए जोड़ें: बीच में सभी गैर डेमॉन अपने आवेदन के द्वारा बनाई गई धागे है कि अभी भी चल रहे हैं:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Interrupting threads");
Set<Thread> runningThreads = Thread.getAllStackTraces().keySet();
for (Thread th : runningThreads) {
if (th != Thread.currentThread()
&& !th.isDaemon()
&& th.getClass().getName().startsWith("org.brutusin")) {
System.out.println("Interrupting '" + th.getClass() + "' termination");
th.interrupt();
}
}
for (Thread th : runningThreads) {
try {
if (th != Thread.currentThread()
&& !th.isDaemon()
&& th.isInterrupted()) {
System.out.println("Waiting '" + th.getName() + "' termination");
th.join();
}
} catch (InterruptedException ex) {
System.out.println("Shutdown interrupted");
}
}
System.out.println("Shutdown finished");
}
});
जिथब पर पूर्ण परीक्षण आवेदन: https://github.com/idelvall/kill-test
'kill -9' का मतलब है:" बेगोन, फाउल प्रोसेस, आपके साथ दूर! ", जिस पर प्रक्रिया समाप्त हो जाएगी। तुरंत ही। – ZoogieZork
अधिकांश * निक्स जिन्हें मैं जानता हूं, मार -9 को किसी भी प्रोग्राम द्वारा अवरुद्ध और सुन्दर तरीके से संभाला नहीं जा सकता है इससे कोई फर्क नहीं पड़ता कि यह किस भाषा में लिखा गया था। –
@ बेगुई: अन्य लोगों ने टिप्पणी की और उत्तर दिया, * अगर * आपका अन * एक्स ओएस तत्काल मारता नहीं है * और सभी संसाधनों को फिर से प्राप्त करें * प्रोग्राम द्वारा * kill -9'ed * के रूप में उपयोग किया जाता है, ठीक है ... ओएस टूटा हुआ है। – SyntaxT3rr0r