2012-05-20 20 views
1

在線程完成它的工作之後,我應該顯式地將線程引用設置爲null還是沒有必要?如果我想將它設置爲null,那麼我應該在代碼中執行此操作?線程完成後,我應該明確地將線程引用設置爲null嗎?

我應該使用thread.isalive標誌檢查線程是否存活,如果線程沒有活動,則將其設置爲空?

+1

爲什麼你想把參數設置爲null? –

+1

@DavidHeffernan這就是我問的問題? – Charu

回答

2

在線程 完成它的工作或它沒有必要之後,我應該明確地設置線程引用爲null嗎?

個人而言,我不打擾。在某些情況下,將對象引用顯式設置爲null真的很重要。不管類型如下:

  • 如果變量是靜態成員,並且它引用的對象會消耗大量內存。
  • 如果該變量是一個實例成員,它包含在一個較長的活動對象中,該對象引用了消耗大量內存的對象。
  • 如果該變量是一個長時間運行的方法的本地引用消耗大量內存的對象。

這些是我能想到的。也許還有更多,但可能並不多。這裏的共同點是變量引用了一個消耗大量內存的對象。受管理的Thread對象本身不會消耗大量內存,因此我無法想象將Thread類型的變量設置爲null會爲您完成很多操作,無論它是如何使用的。大多數資源在線程啓動時分配,然後在線程結束時釋放資源。

我應該檢查,如果線程是活着還是不使用thread.isalive標誌和 然後將其設置爲null,如果它不是活着。

我更喜歡用Thread.Join來測試並等待線程完成。事實上,我有從來沒有使用Thread.IsAlive任何有用的......有史以來。


的GC實際上是足夠聰明,處理本地對象的引用之前的方法結束,如果它能夠檢測到基準不再使用。

3

你應該把一個線程像任何其他對象:
保持基準只要只因爲你需要它(例如用於Join())。

當你確實有一個長時間參考線程(即在一個靜態字段中),那麼當你不再需要它時,你應該將它設置爲null。但最好不要有這樣的變數。

+1

這與知道原始海報中引用的變量是相關的。局部變量或實例字段(在什麼對象上)或靜態字段? –

+0

@JeppeStigNielsen這是一個靜態字段 – Charu

+0

@Charu - 然後嘗試重新設計並擺脫它。 –

相關問題