2009-12-03 39 views
6

我正在爲我的任務使用線程池。在完成每個任務後,我使用Thread.stop()Thread.destroy()銷燬線程。但在運行我的應用程序(在Eclipse中)大約30分鐘後。我得到一個內存越界的錯誤。如何在完成任務後在java中銷燬線程

請建議我如何殺死線程。

回答

13

如果你使用的是線程池,你不應該終止線程開始 - 線程池的整個重點是重用線程。

如果你不想想要重用線程,那麼只需啓動一個新的線程,而不是使用線程池 - 並讓線程死掉,而不是調用stop或destroy。這些方法由於很好的原因而被棄用 - 它們基本上不應該被調用。

雖然不太清楚這將如何導致內存不足異常,但是您有任何理由將重點放在線程作爲可能的原因嗎?

4

當任務完成時,線程運行應該返回。別做什麼了。這會照顧到事情。

5

爲了加強@Jon Skeet的說法,將過時的Thread.stop()Thread.destroy()方法稱爲是一個很不好的想法。

根據javadoc,Thread.destroy()是從根本上是危險的,並沒有實施。最初的想法是簡單地殺死線程並打破所有監視器鎖。如果碰巧在更新共享數據結構的過程中,數據結構將處於不確定狀態。等待殺死線程通知某個對象的其他線程將等待。

Thread.stop()會導致ThreadDeath異常在意外的情況下(對被命中的代碼)引發。它比殺死一個線程更有序,但除非所有已停止的線程(包括它調用的任何東西)都用finally塊仔細寫入以通知等待者,恢復數據結構等,否則您也有同樣的問題。

查看全文Java Thread Primitive Deprecation

+0

是的,非常危險。我經常開玩笑說殺死線程的唯一安全方法是使用System.exit()。 – PSpeed 2009-12-03 12:35:44

0

在調試模式下,線程不會被垃圾收集器清除。 嘗試運行應用程序,而不是在調試模式下運行,一切都應該沒問題。

相關問題