2012-09-02 39 views
2

我有一個類(class A爲例)實現Runnable。在run方法我有一個try catch。我想捕捉到啓動新的thread這樣開始一個新的線程捕獲

new Thread(new A()).start(); 

這是一個真實的方式來處理異常?

我的意思是也許它是一種危險的方式,因爲堆很快就會變滿;換句話說garbage collector不會垃圾這object,因爲另一個對象已經在其中創建。

回答

4

我的意思是,也許它是一種危險的方式,因爲堆很快就會變滿;換句話說,垃圾收集器不會垃圾該對象,因爲另一個對象已經在其中創建。

這是沒有危險因爲這個原因。如果我們假設new Thread(new A()).start();是原始線程退出前的最後一件事,那麼當我們需要GC時,原始線程將退出,因此其堆棧內容將無法訪問。仍然可以訪問的唯一線程將是它仍然活着的線程。

然而,這是危險的,如果新線程容易重複計算,然後再拋出同樣的異常,並再次,再次......所以,如果你寫這樣的代碼,它是一個好主意應用程序可以跟蹤線程重新啓動的頻率,如果發生的頻率過高,可以拔下插件。

編寫的代碼的另一個問題是啓動原始線程的代碼看到它死了,但沒有聽到有關新線程的消息。如果你想通過中斷工作線程來啓動關閉,這是有問題的。

如果將這兩個問題(和其他問題)放在一起,那麼啓動原始線程的代碼負責重新啓動會更好。

1

如果您沒有存儲任何對您創建的線程的引用 - 終止時它將被GC清除。在你的情況下,我認爲在run()方法內啓動一個新線程是非常安全的。

只要確保你沒有創建內部類或存放該線程實例 - 它可以引起,當然內存泄漏。

祝你好運

3

線程是新的平行輕量級的過程。一旦其運行方法完成,它將有資格獲得GC。我認爲它不會影響從它開始的對象的GC生命週期。

你的情況只有一件新事情是用線程處理異常。不知道爲什麼要這樣做的更多細節,很難說它是安全的/好的做法。

2

這不是一個處理線程內異常的好方法。爲什麼新創建的同一類型的線程不會有相同的異常?

你應該做的是有某種形式的線程管理器了從線程,將監測,處理,並在必要時重新創建新線程時,舊的失敗的水平。

這將允許你添加更多的方式來處理錯誤,並會好看很多整潔,如果你嘗試和調試線程。而不是所有這些掛起的線程(導致父母被GC清理),你會知道所有線程都從同一個位置產生。

你提議不會雜亂堆,因爲當他們已經完成正在運行的線程將被GC'd什麼。

+0

Thanx Serdalis這似乎是一個合乎邏輯的方式來處理them.but但我有一個問題:你說「父母被清理」,那麼如何才能保持一個新類的實例已被創建? –

+1

如果家長被垃圾收集器清理乾淨,則無法確定您正在查看的線程在何處或什麼時候生成。如果遇到新的錯誤,這將很難進行調試。 – Serdalis

+0

所以我從你的理解是,這種方式對堆不危險,不會導致內存泄漏,但很難調試。正確? –

相關問題