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

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

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

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

debug.log( category, message); 

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

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

  public class ThreadGroupLocal extends ThreadLocal { private static class ValueHolder { public Object value; } // Weak & Concurrent would be even the better, but Java API wont offer that :( private static ConcurrentMap map = new ConcurrentHashMap; 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 groupLocal = new ThreadGroupLocal(); groupLocal.setValue("foo"); //... String foo = groupLocal.getValue(); 

这样做(期望初始化)完全像本地线程一样执行。

ThreadGroup很少使用,因此没有平台支持。

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

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

我最后一次查看实现(几年前)Thread Locals是作为一个由线程id索引的简单哈希表实现的。 没有什么花哨的,远离C ++的效率。

您可以这样做,并使用线程组对象作为您自己的线程组本地哈希表的键。