如果滿足某個條件,我想退出Java進程並在完成正常運行之前釋放所有資源。我不想退出JVM,因爲我有其他的Java程序在同一時間運行。 return;
是否做到了上述要求,還是有更好的方法來做到這一點?Java退出程序而不退出JVM
謝謝。
如果滿足某個條件,我想退出Java進程並在完成正常運行之前釋放所有資源。我不想退出JVM,因爲我有其他的Java程序在同一時間運行。 return;
是否做到了上述要求,還是有更好的方法來做到這一點?Java退出程序而不退出JVM
謝謝。
@ aix的答案可能適合您的問題。每次運行java
命令(或等效命令)時,都會得到不同的JVM實例。在一個JVM實例中調用System.exit()
不會導致其他JVM實例退出。 (試一下吧!)
它是可能的創建一個框架,你可以在同一個JVM中運行多個程序。事實上,當你運行一個「豆殼」時,這實際上就是你所做的。當你的「程序」是在一些應用服務器框架中運行的服務(或webapps,或者你稱之爲的任何東西)時,會發生同樣的事情。
壞消息是,如果你這樣做,沒有完全可靠的方法讓個人「程序」消失。特別是,如果程序不是設計爲合作的(例如,如果程序沒有檢查中斷),你將不得不訴諸於DEPRECATED Thread.stop()
方法和朋友。而這些方法可能會對JVM和其中運行的其他程序產生不良後果。
理論上,解決這個問題的方法是使用Isolates。不幸的是,我不認爲任何主流的JVM都支持Isolates。
每個正在運行的Java應用程序都有一個JVM進程。如果您退出該應用程序,則進程的JVM將關閉。但是,這不會影響其他Java進程。
我開始他們作爲服務在Debian linux下,似乎如果我'System.exit();'其中一個,其他人將退出以及...我可能必須啓動它們作爲單獨的Java程序..現在會嘗試。感謝您的快速回復。那麼,「回報」會產生什麼效果呢? – Sigtran 2011-04-18 10:48:31
如果其他正在同時運行的線程不是守護進程線程,則不會終止該虛擬機。其他線程將繼續運行。
雖然我完全錯過了這一點。
如果您在單獨的JVM中啓動每個程序,在其中一個調用System.exit()
不會影響其他程序,它們是完全不同的進程。
如果您是通過單個腳本或其他東西來啓動它們,具體取決於它如何寫入,則可能會殺死其他進程。如果沒有關於如何啓動這些應用程序的準確信息,則完全不知道發生了什麼。
您需要了解JVM機制並澄清術語。
讓我們使用以下作爲術語的數據。
線程是進程內併發處理流程的分支。
進程是一個OS級別的線程。操作系統管理這些進程。通過向OS管理器發送終止信號終止進程。該信號可以由進程本身或具有適用特權的另一進程發送。
在一個流程中,您可以創建流程級別的線程。進程級別的線程通常由OS的進程管理提供便利,但它們由進程啓動並由進程終止。因此,進程級線程與進程不一樣。
應用程序是以各種形式合作的系統,程序和/或線程的集合。應用程序中的程序或進程可以終止而不終止整個應用程序。
在JVM術語的上下文中,程序可以是下列之一。
程序按每個JVM進程運行。每個程序使用一個JVM進程,並通過提供java字節碼的類路徑並指定在類路徑中找到的主入口點來調用。當你終止一個Java程序時,運行該程序的整個jvm進程也會終止。
程序按進程級別線程運行。例如,在tomcat或JEE服務器中運行的應用程序在JEE進程中作爲線程運行。 JEE進程本身就是一個使用一個JVM進程的程序。當您終止一個應用程序時,JEE進程不會終止。
您可以在java程序中啓動進程級線程。你可以編寫終止線程的代碼,但不會終止進程(除非它是進程中最後一個也是唯一運行的線程)。 JVM垃圾回收將負責釋放資源,並且在進程級別線程終止後您不需要自己釋放資源。
爲了理解,上述響應被簡化了。請閱讀OS設計和線程,以便更好地理解進程和JVM機制。
是的,似乎我需要閱讀線程/服務器體系結構和操作系統設計 - 我不知道單獨啓動java程序會創建單獨的JVM ...我寧願在一個JVM中啓動它們以節省一些內存,但它是另一天的工作。猜猜當我更好地理解它們應該如何工作以及如何終止一個線程(?)而不終止所有這些程序時,我會重新連接這些特定的程序。 – Sigtran 2011-04-18 11:44:18
是的,現在我只是單獨啓動它們,現在它吃了更多的RAM。在多線程系統中,你可以執行'join()',但不知道除了單獨的初創公司該怎麼做。 – Sigtran 2011-04-18 11:11:06
做一個'join()'只有在「程序」合作的情況下才有效;例如定期檢查它是否被打斷。 – 2011-04-18 11:16:01