2010-01-06 3 views
8

Я ищу класс, похожий на ThreadLocal, который будет работать на группы потоков вместо потоков.Есть ли в группе переменные-локальные переменные?

Если такого класса нет (в некоторой библиотеке с открытым исходным кодом), как вы его реализуете? Что-то лучше, чем иметь группы потоков в WeakHashMap?

Я реализую структуру отладки, настраиваемую во время выполнения с различными параметрами в глобальных контекстах, в потоках и в потоковой группе. В качестве простого примера, вы можете иметь отчетность о:

debug.log(category, message); 

и указать, что запись журнала с этой конкретной категорией будет отображаться только при вызове нити в группе потоков обслуживания сетевых запросов.

+1

Для большей наглядности вы можете попробовать некоторые примеры использования. Также почему/как вы хотите это сделать. –

+0

@Kevin: Просто добавлена ​​мотивация и простой пример. – Viliam

ответ

4

Я бы сохранил держатель значений в потоке локальный и инициализировал его для одного и того же держателя значений для всех потоков одной и той же группы.

public class ThreadGroupLocal<T> extends ThreadLocal<ValueHolder> { 
    private static class ValueHolder { 
     public Object value; 
    } 
    // Weak & Concurrent would be even the better, but Java API wont offer that :(
    private static ConcurrentMap<ThreadGroup, ValueHolder> map = new ConcurrentHashMap<ThreadGroup, ValueHolder>; 
    private static ValueHolder valueHolderForThread(Thread t) { 
     map.putIfAbsent(t.getThreadGroup(), new ValueHolder()); 
     return map.get(t.getThreadGroup()); 
    } 
    @Override 
    protected ValueHolder initialValue() { 
     return valueHolderForThread(Thread.currentThread()); 
    } 
    public T getValue() { (T) get().value; } 
    public void setValue(T value) { get().value = value; } 
} 

, а затем использовать

ThreadGroupLocal<String> groupLocal = new ThreadGroupLocal<String>(); 
groupLocal.setValue("foo"); 
//... 
String foo = groupLocal.getValue(); 

Это делает (ожидать для инициализации) выполняют так же, как нить местного.

+0

Почему вы не создали ValueHolder? И почему вы расширили ThreadLocal? Использование ThreadLocal является деталью реализации. –

+0

Хорошие моменты, их стоит рассмотреть. Я написал этот код в спешке как доказательство концепции, поэтому, пожалуйста, просмотрите (и проверьте !!!) его перед использованием в процессе производства. (PS: * Теперь я помню, почему ValueHolder не является генератором, потому что они хранятся в статической карте хэша, которая бы вырождалась до '', поэтому вам все равно нужно делать бросок.*) – akuhn

+0

+1, только то, что я искал. Знаете ли вы, что в настоящее время Java API поддерживает эту функцию? – dreamcrash

2

Последний раз, когда я смотрел на реализацию (ну, несколько лет назад), точки были реализованы как простая хеш-таблица, индексированная идентификатором потока. Ничего необычного и далеко от эффективности C++.

Вы можете сделать то же самое и использовать объект группы нитей в качестве ключа для своей собственной хэш-таблицы локальных групп нитей.

+0

Even (Sun) 1.2 обновлен, чтобы этого не сделать. Это очень неэффективно. –

+0

Да, я знаю, что это было давно. – Lothar

+0

Я думаю, что теперь это хэш-таблица внутри экземпляра Thread, проиндексированная объектом ThreadLocal. Это устраняет накладные расходы синхронизации, одну личную хэш-таблицу на поток. – Thilo

5

ThreadGroup редко используется, поэтому нет поддержки платформы.

Использование [Weak/Identity/Concurrent] HashMap<ThreadGroup,T> будет примерно работать, если не очень быстро. Вы действительно хотите, чтобы карта была слабой, идентичной и параллельной, но с помощью библиотеки Java, которую вы только выбираете, в настоящее время.

Для улучшения производительности обратите внимание, что Thread s не меняет ThreadGroup. Поэтому кешируйте значение с помощью ThreadLocal (переопределить initialValue). ThreadLocal имеет хорошую производительность (пара дюжины циклов за get).

+0

Хороший трюк, спасибо. – Viliam

+0

+1 для проблем с производительностью. Знаете ли вы, что в настоящее время Java API поддерживает эту функцию? – dreamcrash

Смежные вопросы