İ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.
@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
Güzel bir cevap; bir değer. – Bathsheba
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