我正在嘗試運行一個基于 .我使用此服務來替換虛擬循環。全局思想是讓首先讓一個(調度程序)執行一個(可運行的)。然后,由于某種原因,可運行對象可能會或可能不會在其他任務(任務器)上計劃任務?,F在的問題是:scheduleAtFixedRateExecutorServicewhileExecutorServiceRunnableExecutorService當我停止程序時,我該如何停止所有這些線程?我已經嘗試了一下,找不到合適的解決方案。我嘗試了兩件事: ,守護進程線程不是我想要的,我希望調度程序繼續運行,直到我停止程序。關閉鉤子乍一看不是一個好的解決方案,但經過一些研究,它似乎有效。DaemonThreadShutdownHook我只是不明白為什么。問題是,如果我使用命令執行代碼并使用 停止它,則會運行 ShutdownHook,但是如果我在 IDE(VScode) 中運行 java 代碼并使用調試器工具停止它,則不會執行它。所以還有兩個問題:mvn exec:java -Dexec.mainClass="com.goodbook.App"Ctrl+C為什么執行關機鉤子?為什么使用命令行運行和使用 IDE 運行之間的行為不同首先,我將為您提供兩段代碼:應用程序和 Task 類。
1 回答

慕絲7291255
TA貢獻1859條經驗 獲得超6個贊
當 JVM 關閉時調用關閉掛鉤;請參閱類 JavaDoc 在運行時.add.下載鉤子
.但是,從調試器終止運行并不是關閉。
常規退出
當最后一個非守護程序線程退出,或者通過代碼調用System.exit(),
或者在命令行上按CTRL-C(或者程序被發送一個終止信號,例如使用任務管理器),然后執行關閉鉤子,一旦它們完成,JVM就會關閉。
退出調試器
如果在調試期間終止程序,然后按“停止”,IDE 將立即中止你的應用。沒有機會運行關機掛鉤。這通常是正確的做法;調試時,您通常只想殺死正在運行的任何內容。
調試時正常退出
如果你想要一種在調試時運行關機鉤子的方法,有很多方法;一種是通過代碼調用系統退出()
;這將觸發鉤子。在這個相關的問題中,他們等待按鍵事件,然后再調用 system.exit。
關于
當我停止程序時,我應該如何停止所有這些線程?
同樣,您可以調用 System.exit(),
這樣即使非 deamon 線程處于執行過程中(這并不干凈),程序也會終止;但更好的方法是給每個線程一個正常終止的通道 - 例如。如果線程正在運行無限循環,它可以定期檢查(易失性)變量,并在變量設置時返回(通過代碼)。(變量本身應由關機掛鉤設置)shutdown
shutdown
添加回答
舉報
0/150
提交
取消