[英]putting thread to sleep with Long.MAX_VALUE
我編寫了一個在服務器上運行並在某些端口上偵聽的程序。 由於大多數情況下它都無關緊要,因此我設置了一個防止程序停止的線程。
我的解決方案如下所示:
Thread mainThread = new Thread( new Runnable() {
@Override
public void run() {
// run program continuously
while ( true ) {
try {
// since we aren't doing anything, the thread can sleep
Thread.sleep( Long.MAX_VALUE );
}
catch ( InterruptedException e ) {
e.printStackTrace();
}
}
}
} );
mainThread.start();
我的問題是:常量Long.MAX_VALUE可能有問題並導致錯誤嗎? 我想一直運行程序,所以我認為線程不需要執行任何操作。 到目前為止,最簡單的解決方案是使它進入(非常非常深的)睡眠狀態(毫秒值大約等於146.235.600年)。
只要有一個線程仍在運行或被阻塞,多線程程序將繼續運行。 並不是僅因為原始線程退出就退出程序。 您的程序大概有一個線程正在等待與端口的連接,因此您不需要這樣做。
要直接回答這個問題,沒有理由認為睡眠任何時間(正),包括Long.MAX_VALUE
,都會表現出與您期望的不同的行為。
至於是否需要執行此操作,我會回應其他人的評論,即從設計角度來看這可能不是最好的選擇,而且很可能會做出更好的體系結構決策來避免此類錯誤(例如創建守護程序)線程非守護程序,如果您希望停止應用程序退出。)但是,從技術上講,是的-線程應該進入睡眠狀態已有幾個世紀了。
羅伯特,如果我們閱讀有關Thread類的文章,我們會看到:
Java虛擬機啟動時,通常只有一個非守護線程(通常調用某些指定類的名為main的方法)。 Java虛擬機將繼續執行線程,直到發生以下任何一種情況:
已調用類Runtime的退出方法,並且安全管理器已允許進行退出操作。
不是守護程序線程的所有線程都已死,要么通過從調用返回到run方法,要么拋出傳播到run方法之外的異常。
似乎您的應用程序總是會在沒有某種形式的“保持活動”機制的情況下關閉,因為您使用的框架中啟動的線程都是daemon
線程。
像您這樣做一樣,防止這種情況的簡單方法是保持單個非守護進程線程處於活動狀態並運行。
正如其他人指出的那樣,您發布的代碼似乎有些“簡單”,但從技術上講,它沒有任何問題。
首先,我建議簡化一下-刪除多余的new Runnable()
使用,並刪除對e.printStackTrace()
的調用。
關於使用Long.MAX_VALUE
作為Thread.sleep的參數,正如其他人所評論的那樣,這完全可以。 但是,最好使用某種常規的“運行狀況檢查”,這樣,如果您使用的框架突然崩潰或退出,那么主線程也會崩潰或退出。
這是我的建議:
Thread mainThread = new Thread() {
@Override
public void run() {
// check if application is healthy at regular intervals
while ( myApplication.isHealthy() ) {
try {
Thread.sleep( 30 );
} catch ( InterruptedException e ) {
// ignore this, or log at DEBUG level
}
}
}
};
mainThread.start();
關於改善機制或尋找另一種方法,我簡要地研究了以下備選方案,但沒有一個取得成果。
BlockingQueue-其他高級並發對象也可以無限期地“阻止”,但它們通常還會引發InterruptedException
,並且肯定不如Thread.sleep
清晰
ShutdownHook-如果所有其余線程都是守護程序,則關閉掛鈎不會停止jvm的停止(視情況而定)
將另一個線程設為非守護進程-盡管您可以輕松找到其他正在運行的線程,但一旦啟動線程,就無法在該線程上調用setDaemon(false)
。
總而言之,在這種情況下,您可以做的很好-如果可以的話,您可以考慮定期檢查框架是否正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.