2013-03-13 2 views
0

Я знаю this Аналогичный вопрос, но мой вопрос касается конкретного случая очистки ThreadLocal.ThreadLocal Очистка вектора в Java

Чтобы сохранить состояние на основе потоков, я сохраняю (неизвестное) число ThreadLocals в статическом векторе. Иногда для «жадного» потока потребуется больше доступных ThreadLocals, и в результате размер Vector будет увеличен. Хотя очистка с использованием ThreadLocal.remove() не является проблемой в моем сценарии, я задаюсь вопросом, удастся ли когда-либо уменьшить размер вектора после того, как жадный поток погибнет или если он будет только расти (или, в лучшем случае, останется тем же).

Чтобы уточнить: я понимаю, что для любого данного ThreadLocal для каждого потока будет существовать другой экземпляр. Как мог тогда мой статический вектор знать, когда он обращается из потока A, что значения ThreadLocal T пусты для всех существующих потоков?

Спасибо за вашу помощь

ответ

1

Пожалуйста, смотрите здесь официальные документы: Vector.trimToSize()

Alternativly: Vector.setSize()

+0

Привет, спасибо. Я знаю об этом, но мой вопрос заключается не в том, как это сделать, а в том, если вообще можно сжать такой Вектор. –

+0

@RaulBertone Я никогда не использовал их, но чтение документов выглядит так: вызов 'setSize()', за которым следует 'trimToSize()', будет делать именно то, что вы хотите. – Windle

+0

Если вы устанавливаете хорошую IDE, это довольно легко CTRL + Щелкните по этому коду. Там вы найдете копию массива для меньшего массива, поэтому вектор действительно уменьшен в области памяти. – Jan

0

Задача вы пытаетесь достичь, это нелогично. Из текущего потока вы не можете знать, используется ли ThreadLocal другим потоком и сколько потоков использует его вообще. Вы можете попытаться объединить ThreadLocals с WeakHashMap (или кэш Guava), но это будет очень странное решение, постарайтесь предотвратить рост ThreadLocals.

+0

Полагаю, я согласен с тобой, поэтому мне интересно, как будет выглядеть поведение программы в такой ситуации. Во всяком случае, я придумал лучшую реализацию, которая использует ThreadLocal вместо Vector , так что теперь есть только один ThreadLocal для каждого потока. Но что, если? :-) –