2012-07-11 13 views
11

साथ काम जब मैं प्रेस करता ctrl?कैसे CTRL-C जावा प्रोग्राम

+2

दस्तावेज़ों को उद्धृत करने के लिए: [जब वर्चुअल मशीन अपने शट डाउन अनुक्रम शुरू करती है तो यह कुछ निर्दिष्ट शटडाउन हुक को कुछ अनिर्दिष्ट क्रम में शुरू कर देगी और उन्हें एक साथ चलने देगी। जब सभी हुक समाप्त हो जाते हैं तो यह अंतिम रूप से चालू होने पर सभी अनजान फाइनलरों को चलाएगा।] (Http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html) इस प्रकार हम शटडाउन हुक इकट्ठा कर सकते हैं हमेशा पहले परवाह किए जाते हैं, जो समझ में आता है या धागे बंद होने पर इस तरह के एक हुक का बिंदु क्या होगा? उपयोगकर्ता को बताने के लिए उसका डेटा –

उत्तर

8

javadocs के अनुसार, पंजीकृत बंद हुक एक अनिर्दिष्ट आदेश में कहा जाता है जब JVM नीचे बंद शुरू होता है; जैसे एक CTRL-C के जवाब में।

आवेदन धागे किसी भी अच्छी तरह से परिभाषित तरीके से "बंद" नहीं होते हैं। दरअसल, जब तक प्रक्रिया समाप्त नहीं हो जाती तब तक वे तब तक चलते रह सकते हैं।

यदि आप अपने धागे को व्यवस्थित रूप से बंद करना चाहते हैं, तो आपको ऐसा होने के कारण शटडाउन हुक में कुछ करने की आवश्यकता है। उदाहरण के लिए, एक शटडाउन हुक Thread.interrupt() पर कॉल करने के लिए कार्यकर्ता धागे को जो कुछ भी कर रहा है उसे रोकने के लिए कह सकता है ... और यह सुनिश्चित करने के लिए join() पर कॉल करें कि यह हुआ है।

+0

सावधानी बरत गया है; 'Thread.join()' शट डाउन के दौरान एक थ्रेड के लिए प्रतीक्षा कर सकता है जो किसी थ्रेड के लिए प्रतीक्षा कर रहा है जो बाधा का सम्मान नहीं करता है। ['Thread.join (long)'] (http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join-long-) का उपयोग करना एक अच्छा विचार है यह सुनिश्चित करने के लिए उचित समय सीमा है कि गलत व्यवहार करने वाले थ्रेड प्रक्रिया से बाहर निकलने को रोक नहीं देते हैं। – dimo414

+0

अच्छा बिंदु। हालांकि, अगर आपके पास कोई थ्रेड है जो किसी बाधा को सही ढंग से प्रतिसाद नहीं देता है, और आप प्लग को JVM पर खींचते हैं, तो जोखिम है कि कुछ ट्रैश हो सकता है। तो, आईएमओ, "डेडलॉक" के कारण को खोजने और ठीक करने का एक बेहतर तरीका है; यानी अपमानजनक धागे को ठीक से इंटरप्ट से निपटने के लिए बदलें। –

5

मुझे पता है कि आप निर्दिष्ट कर सकते हैं कि क्या होना चाहिए जब शटडाउन हुक जोड़कर Ctrl-C मारा जा रहा हो। लेकिन मुझे यकीन नहीं है कि किस क्रम में।

private static void createShutDownHook() 
{ 
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      System.out.println(); 
      System.out.println("Thanks for using the application"); 
      System.out.println("Exiting..."); 

     } 
    })); 
} 
संबंधित मुद्दे