2013-03-13 70 views
0

我知道this類似的問題,但我的問題涉及到ThreadLocal清理的特定情況。Java中的ThreadLocal矢量清理

爲了在線程的基礎上維護狀態,我將一個(未知)數量的ThreadLocals存儲在一個靜態向量中。有時候一個「貪婪的」線程將需要更多的ThreadLocals可用,結果Vector大小將會增加。儘管使用ThreadLocal.remove()進行清理在我的場景中並不是問題,但我懷疑在貪婪線程死亡後它是否能縮小向量大小,或者它是否只能增長(或者至多保持不變)。

澄清:我的理解是,對於任何給定的ThreadLocal,每個線程都會存在一個不同的實例。那麼我的靜態Vector如何知道,當它從線程A被訪問時,ThreadLocal T的值對於所有現有的線程都是空的?

感謝您的幫助

回答

1

請參見這裏的官方文檔: Vector.trimToSize()

Alternativly:Vector.setSize()

+0

嗨,謝謝。我意識到這一點,但我的問題不是如何去做,而是如果它完全有可能縮小這樣一個向量。 – 2013-03-13 13:15:09

+0

@RaulBertone我從來沒有使用過這些,但是閱讀它看起來像調用'setSize()'後跟'trimToSize()'的文檔將會完全按照您的需要進行操作。 – Windle 2013-03-13 13:28:29

+0

如果您安裝了一個漂亮的IDE,那麼CTRL +點擊該代碼非常容易。在那裏你會發現一個數組拷貝到一個更小的數組,所以這個矢量在內存佔用中真正減少了。 – Jan 2013-03-13 15:16:29

0

你正在努力實現的任務是不合邏輯的。從當前線程你不知道ThreadLocal是否被另一個線程使用,以及有多少線程正在使用它。你可以嘗試將ThreadLocals和WeakHashMap(或番石榴的緩存)結合起來,但這將是一個非常奇怪的解決方案,試圖阻止ThreadLocals的增長。

+0

我想我同意你的看法,這就是爲什麼我想知道在這種情況下程序行爲是什麼。無論如何,我想出了一個更好的實現,它使用ThreadLocal 而不是Vector ,所以現在每個線程只有一個ThreadLocal。但是,如果? :-) – 2013-03-13 14:45:35