Java中是否存在线程组本地变量?

Vil*_*iam 9 java multithreading

我正在寻找一个类似于ThreadLocal的类,它可以在线程组而不是线程上工作.

如果没有这样的类(在一些开源库中)你将如何实现它?比在WeakHashMap中拥有线程组更好的想法?

我在运行时实现了一个可调整的调试框架,其中包含全局,每线程和每线程组上下文中的各种参数.作为一个非常简单的示例,您可以拥有一个报告声明:

debug.log( category, message);
Run Code Online (Sandbox Code Playgroud)

并指定仅当由服务于网络请求的线程组中的线程调用时,才会显示具有该特定类别的日志条目.

Tom*_*ine 5

ThreadGroup 很少使用,所以没有平台支持.

使用[ Weak/ Identity/ Concurrent]HashMap<ThreadGroup,T>只会工作,如果不是很快.你真的希望地图都是弱的,身份和并发的,但是对于Java库,你现在只能选择一个.

要提高性能,请注意Threads不会更改ThreadGroup.因此,使用ThreadLocal(覆盖initialValue)缓存该值.ThreadLocal具有良好的性能(每个十几个周期get).


aku*_*uhn 5

我将一个值持有者存储在本地线程中,并将其初始化为同一组的所有线程的相同值持有者.

 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; }
 }
Run Code Online (Sandbox Code Playgroud)

然后使用

 ThreadGroupLocal<String> groupLocal = new ThreadGroupLocal<String>();
 groupLocal.setValue("foo");
 //...
 String foo = groupLocal.getValue();
Run Code Online (Sandbox Code Playgroud)

这样做(期望初始化)与本地线程完全相同.