2012-07-11 14 views
11

ile CTRL-C çalışma basın ne zaman girer?nasıl <kbd>ctrl</kbd> Java programı

+2

Dokümanlardan alıntı yapmak için: [Sanal makine kapatma sırasını başlattığında, tüm kayıtlı kapatma kancalarını belirsiz bir sırada başlatır ve eşzamanlı çalışmasına izin verir. Tüm kancalar bittiğinde, çıkışta sonlandırma etkinleştirildiyse, tüm müdahalesi yapılmamış finalizörleri çalıştıracaktır.] (Http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html) Böylece, kapanış kancaları toplayabiliriz her zaman ilk olarak adlandırılır, hangisi mantıklıdır veya iş parçacığı kapanıyorsa böyle bir kanca noktası ne olurdu? Bir kullanıcıya onun verilerini bildirmek için –

cevap

8

javadocs göre, kayıtlı kapatma kancalar bir belirtilmemiş sırayla denir; Örneğin. CTRL-C'ye yanıt olarak.

Uygulama konuları iyi tanımlanmış bir şekilde "durdurulamıyor" değil. Gerçekten, süreç çıkana kadar sağa doğru devam edebilirler.

Konularınızın düzenli bir şekilde kapatılmasını istiyorsanız, bunun gerçekleşmesi için bir kapatma kancası içinde bir şeyler yapmanız gerekir. Örneğin, bir kapanma kancası, çalışan iş parçacığının yaptıkları şeyi durdurmalarını söylemek için Thread.interrupt() numaralı telefonu arayabilir ve bunun gerçekleştiğinden emin olmak için join() numaralı telefonu arayabilir.

+0

Dikkat; 'Thread.join()', kapatma sırasında kesintiye uymayan bir iş parçacığı beklerken kilitlenmeye neden olabilir. ['Thread.join (long)'] (http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join-long-) ile iyi bir fikir. Yanlış iş parçacıklarının işlem çıkışını engellememesini sağlamak için makul zaman aşımı. – dimo414

+0

İyi nokta. Bununla birlikte, bir kesmeye doğru yanıt vermeyen bir iş parçacığınız varsa ve JVM'deki fişi ne olursa olsun dikkate almazsanız, bir şeyin çöpe atılması riski vardır. Öyleyse, IMO, daha iyi bir yaklaşım "çıkmaz" ın nedenini bulmak ve düzeltmek; diğer bir deyişle, kesintileri uygun bir şekilde ele almak için rahatsız edici ipliği değiştirir. –

5

Ctrl-C'ye bir kapatma kancası eklendiğinde ne olacağını belirtebileceğinizi biliyorum. Ama hangi sırayla emin değilim. JVM kapatılıyor başladığında

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..."); 

     } 
    })); 
} 
İlgili konular