[英]Linux Shutdown and Java Shutdown Hook
當我在后台運行Java進程並關閉計算機(ArchLinux)時,計算機是否會等待幾秒鍾以終止Java中的shutdown-hook?
如果你想在系統關閉時做一些事情,你需要添加一個shutdown-hook(假設你已經這樣做了):
Runtime.getRuntime().addShutdownHook(
new Thread(new Runnable() {
@Override
public void run() {
// This method will be executed and Virtual Machine will close when this method will return
}
}));
如果花費太多時間 ,系統將永遠不會等待完全終止
來自doc Runtime#addShutdownHook
當虛擬機因用戶注銷或系統關閉而終止時,底層操作系統可能只允許一段固定的時間來關閉和退出。 因此,不建議嘗試任何用戶交互或在關閉鈎子中執行長時間運行的計算。
您可以將Java程序包裝為服務,它將啟動並關閉操作系統。 最簡單的方法之一是使用spring boot框架 。
當關閉JVM的調用被調用時,將調用關閉鈎子。 但是,無法保證將調用掛鈎。 鈎子可能不會/不會運行:
Runtime.halt()
還將阻止鈎子開始運行。 當用戶關閉計算機時(而不是通過拉動插頭),計算機會向JVM發送一個關閉命令,該命令將執行關閉掛鈎,但是如果拔掉電源,計算機將沒有時間做任何事情,讓單獨向JVM發出命令。
我記得在某處讀過(但我再也找不到鏈接) - 它說一個關閉鈎子不應該花費很多時間來執行,或者當系統想要關閉時windows可能會殺死它。 這表示如果您決定通過操作系統關閉系統,將運行關閉掛鈎。
Tl; dr:這取決於直接拉動電源,或者如果操作系統崩潰,它們將無法運行。 正常的操作系統關閉將運行掛鈎,但操作系統可能會在完成之前關閉它們,如果它們花費的時間太長。
這是來自javadoc。
當虛擬機因用戶注銷或系統關閉而終止時,底層操作系統可能只允許一段固定的時間來關閉和退出。 因此,不建議嘗試任何用戶交互或在關閉鈎子中執行長時間運行的計算。
這表明當操作系統想要關閉時會掛起鈎子,但是建議它們不會花很長時間或者它們可能會被殺死。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.