簡體   English   中英

Java:正確關閉多個線程

[英]Java: Closing multiple threads properly

我正在制作一個簡單的服務器,它將生成多個線程來處理多個客戶端。 我想知道在終止服務器時關閉和關閉所有各種流和線程的正確方法。

我添加了一個shutdownHook,它運行告訴服務器關閉的方法。 反過來,服務器將關閉調用廣播到它已打開的所有線程,這會將每個線程中的“ isClosed”布爾值設置為true。

我期望的是,每個線程在到達run()方法的末尾並再次循環運行時,都會達到while(!isClosed)條件,從而通過關閉所有適當的套接字/流並返回來正確地終止自身。

但是,我不知道這是否可以正確關閉所有內容,因為該程序應在關閉掛機完成后終止。 由於它所做的只是傳播關閉消息,因此它相當早完成。 這是否意味着某些線程將沒有足夠的時間正確關閉?

如果是這樣,最好的方法是讓shutdownhook在返回之前手動關閉每個線程,確保它們已關閉嗎?

使用ExecutorService是現代的方法。 它占用了代碼中那么多巧妙的位。

是一個不錯的起點。

您是正確的,如果服務器終止,線程可能沒有足夠的時間正確終止。 但是,根據您要嘗試執行的操作,這可能會或可能不會出現問題。 如果不需要清理工作,那么您可能不必擔心,因為線程突然終止不會造成任何問題。

但是,如果需要完成清理工作(例如寫入數據庫),那么您還需要其他工作。 最好的方法(使用Java)是使用Executor / ExecutorService和相關項目( http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html )。 這些可以很好地解決您的問題,此外,您還可以獲得一些不錯的免費贈品,例如線程池管理,因此擴展變得更加容易。 如果為每個客戶生成一個新線程,則稍后嘗試擴展時會遇到很大的問題,因為例如每分鍾不能創建一百萬個線程。

如果您習慣使用原始線程,那么使用Excecutor的東西會有些調整,但這值得研究。 祝好運!

shutdownHook在周期中發生得太晚,以至於無法以這種方式使用。 預計它將很快完成,並且JVM已經處於關閉狀態,如果它們是守護程序,則可能會將現有線程與它一起使用。

我只是將連接超時設置為15-30秒。 如果發生超時(SocketTimeoutException) ,請關閉套接字並退出線程。 客戶當然必須處理掉線的連接,但是他們必須已經這樣做。 然后,當您要關閉時,只需停止接受新的連接即可(例如,關閉ServerSocket並使其接受線程正確處理產生的異常)。 當所有現有連接線程均已退出時,JVM將退出,這實際上應該不超過超時時間加上最長事務的時間。 確保連接線程不是守護程序。

如果您不介意客戶在交易中被砍掉,只需調用System.exit().

您是否考慮過將線程守護進程線程化。 只需添加t.setdaemon(true); 在調用線程的start方法之前。 如果這些線程應在程序結束時結束,則使它們成為守護程序將在所有其他非守護程序線程結束后將其殺死。 線程池中使用的線程是應該作為守護程序的線程的一個很好的例子。 我真的認為這對您可能有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM