2013-10-23 25 views
9

Java'da oldukça karmaşık bir kapatma işlemim var - yapılacak çok fazla temizlik işi var. Özellikle, bir kapanma kanca iş parçacığının hata nasıl işleneceğini anlamaya çalışıyorum. Benim kod şu ürünler bulunmaktadır:System.exit bir kapatma kancasından çağrılırsa ne olur?

try { 
    return shutdownPromise = doShutdown(); 
} 
catch (Throwable exc) { 
    logger.error("An exception was thrown while shutting down the application.", exc); 
    System.exit(1); 
    return null; 
} 

Başlangıçta ben aslında, kapatma sürecinin bir hata sadece exit düz gitmeli, düşünce bu yazdığımda. Ancak exit çok düşük seviyede değildir; Kapatma kancalarını çağırır.

Ben de düşündüm -

  1. bir kapatma kancadan çağıran çıkış ne yapar?
  2. Bir kapatma kancasından hata işlemenin doğru yolu nedir?
+4

@libik Neden olmasın? Bu bilgiyi teşvik etmek için teşvik edildi. Aslında, "kendi sorunuzu cevaplayın" diyen bir onay kutusu var. – Doorknob

+0

Güzel bir cevap; bir değer. – Bathsheba

+1

Evet, ama gerçekten soruyu sorduğun sürece ve bunu kendin ya da başkalarının yardımıyla çözdüğün müddetçe ... Kimsenin herhangi bir cevabı bulunmadan önce soru sormak ve cevap vermek için değil. – libik

cevap

19

İlk olarak, kolay yanıt: işleminizin kilitlenme süreleri.

System.exit this code block ile biter, Shutdown.exit arayarak rüzgarlar:

synchronized (Shutdown.class) { 
    /* Synchronize on the class object, causing any other thread 
     * that attempts to initiate shutdown to stall indefinitely 
     */ 
    sequence(); 
    halt(status); 
} 

comment tamamen doğrudur. Ama bunu anlamak için, kapatma kancasının ne yaptığını tam olarak görmemiz gerekiyor.

Kapatma kancaları aracılığıyla this answer here'de açıklandığı gibi eklenir. Sonunda yukarıda sequence yöntem Shutdown.runHooks içinde this line of code rüzgarlar kadar unutmayın: Öncelikle

if (hook != null) hook.run(); 

, bu kancalar değil Başvurunuz kapatma kanca unutmayın. Bunlar farklı olan sistem kapatma kancalarıdır ve bunlardan biri uygulama kapatma kancalarının çalışmasını sağlamaktan sorumludur. Not çalıştır, 'u başlatın. Başka bir deyişle, bloklarını engeller. Bu kapatma kancalarından biri, tüm uygulama kapatma kancalarını aynı anda başlatan bir sistem kancası olacaktır (bu kodu kendiniz için veya bağlantılı yanıtta izleyebilirsiniz), daha sonra hepsi bir Thread.join çağrısı kullanarak tamamlanana kadar bloklar. Bunlardan biri sizin uygulama kapatma kanca olacaktır - System.exit çağırırsa, sonsuza kadar Shutdown.class kilidi almak için bekliyor olacak.

Sonraki, aptal cevap: bunun yerine Runtime.getRuntime().halt() numaralı telefonu arayın. Ben "aptal cevap" diyorum çünkü bu muhtemelen çıkış yerine yapmak istediğiniz biraz daha düşük seviyeli bir şey. System.exit başarısız bir temiz kapatma temsil ediyorsa, halt her zaman hemen başarılı olacak bir zor kapatmadır.

Sonraki, daha akıllı cevap: Muhtemelen hiçbir şey. Sadece aşağıdaki nedenlerden dolayı kapatma kancasının bitmesine izin verin. Kapanış kancanız kapanmaya sahip değil - özellikle de işlerini yapması gereken başka kapatma kancaları olabilir. Tersine, bu kancanın sorumluluklarından birinin, sonunda bir zorla kapatma zorlamaktan şüpheleniyorum. Bunu gecikmeli bir görev olarak oluşturmayı hemen öneriyorum ve bu bağlantıyı normal olarak tamamlamanızı öneriyorum.

İlgili konular