मैं उम्मीद होती है कि JVM शान से बीच में आता है ( thread.interrupt()
) चल रहे सभी आवेदन द्वारा बनाई धागे, कम से कम संकेतों के लिए SIGINT (kill -2)
और SIGTERM (kill -15)
।
इस तरह, सिग्नल को उनके पास भेजा जाएगा, जो मानक तरीके से एक सुंदर रूप से थ्रेड रद्द करने और संसाधन को अंतिम रूप देने की अनुमति देगा ।
लेकिन यह मामला नहीं है (कम से कम मेरे जेवीएम कार्यान्वयन में:) 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
कैप्चर किया जाता है और उपयुक्त क्लीन-अप किया जाता है। इन थ्रेड्स को एक रुकावट अनुरोध का जवाब देने के लिए जाना जाता है। उच्च सामंजस्य डिजाइन।
इसलिए, इन मामलों में, मैं एक शटडाउन हुक जोड़ता हूं, जो मुझे लगता है कि जेवीएम को डिफ़ॉल्ट रूप से करना चाहिए: मेरे एप्लिकेशन द्वारा बनाए गए सभी गैर-डेमॉन थ्रेड्स को बाधित करें जो अभी भी चल रहे हैं:
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");
}
});
Github पर पूरा परीक्षण आवेदन: https://github.com/idelvall/kill-test
kill -9
मेरे लिए इसका मतलब है: "बेगोन, बेईमानी प्रक्रिया, तुम्हारे साथ दूर!", जिस पर यह प्रक्रिया समाप्त हो जाएगी। तुरंत ही।