亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我需要清理 Java 中的 Thread 對象嗎?

我需要清理 Java 中的 Thread 對象嗎?

拉丁的傳說 2023-10-12 16:54:31
在我的 Java 應用程序中,我有一個 Runnable,例如:this.runner = new Runnable({    @Override    public void run() {        // do something that takes roughly 5 seconds.    }});我需要大約每 30 秒在一個單獨的線程中運行一次(盡管這可能會有所不同)。代碼的本質是我可以運行它并忘記它(無論它成功還是失?。?。我在應用程序中將其作為一行代碼執行,如下所示:(new Thread(this.runner)).start()現在,這工作正常。但是,我想知道在每個線程實例完成運行后是否應該對其進行任何類型的清理?我正在對這個應用程序進行 CPU 分析VisualVM,我可以看到,在 1 小時的運行時間過程中,創建了很多線程。這種擔憂是否有效,或者一切都好嗎?new Thread注意我開始 a而不是簡單地定義this.runner為 a的原因Thread是,我有時需要this.runner同時運行兩次(在第一次運行調用完成之前),如果我定義this.runner為 a ,我就不能這樣做Thread,因為單個Thread對象只能初始執行完成后再次運行。
查看完整描述

2 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

使用后需要“清理”或“關閉”的Java對象通常實現該AutoCloseable接口。這使得使用try-with-resources可以輕松地進行清理。該類Thread沒有實現AutoCloseable,并且沒有“close”或“dispose”方法。因此,您不需要進行任何顯式清理。

然而

(new?Thread(this.runner)).start()

不保證立即開始 的計算Runnable。您可能不關心它是成功還是失敗,但我想您確實關心它是否運行。您可能希望限制同時運行的這些任務的數量。例如,您可能只想一次運行一個。所以你可能想要join()線程(或者,也許,加入超時)。加入線程將確保線程完成其計算。以超時方式加入線程會增加線程開始計算的機會(因為當前線程將被掛起,從而釋放可能運行其他線程的 CPU)。

但是,不建議創建多個線程來執行常規或頻繁任務。您應該將任務提交到線程池。這將使您能夠控制最大并發量,并且可以為您提供其他好處(例如區分不同任務的優先級),并分攤創建線程的費用。

您可以將線程池配置為使用固定長度(有界)任務隊列,并讓提交線程在隊列已滿時自行執行已提交的任務。通過這樣做,您可以保證提交到線程池的任務(最終)被執行。的文檔ThreadPool.execute(Runnable)說明了這一點

在將來的某個時間執行給定的任務

這表明該實現保證它最終會運行所有提交的任務,即使您不執行這些特定任務以確保執行提交的任務。


查看完整回答
反對 回復 2023-10-12
?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

我建議您查看并發 API。有許多預定義的通用方法。通過使用 ExecutorService,您可以在向執行器提交任務后調用 shutdown 方法,該方法會停止接受新任務,等待之前提交的任務執行,然后終止執行器。

查看完整回答
反對 回復 2023-10-12
  • 2 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號