Vil*_*iam 9 java multithreading
我正在寻找一个类似于ThreadLocal的类,它可以在线程组而不是线程上工作.
如果没有这样的类(在一些开源库中)你将如何实现它?比在WeakHashMap中拥有线程组更好的想法?
我在运行时实现了一个可调整的调试框架,其中包含全局,每线程和每线程组上下文中的各种参数.作为一个非常简单的示例,您可以拥有一个报告声明:
debug.log( category, message);
Run Code Online (Sandbox Code Playgroud)
并指定仅当由服务于网络请求的线程组中的线程调用时,才会显示具有该特定类别的日志条目.
ThreadGroup 很少使用,所以没有平台支持.
使用[ Weak/ Identity/ Concurrent]HashMap<ThreadGroup,T>只会工作,如果不是很快.你真的希望地图都是弱的,身份和并发的,但是对于Java库,你现在只能选择一个.
要提高性能,请注意Threads不会更改ThreadGroup.因此,使用ThreadLocal(覆盖initialValue)缓存该值.ThreadLocal具有良好的性能(每个十几个周期get).
我将一个值持有者存储在本地线程中,并将其初始化为同一组的所有线程的相同值持有者.
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)
这样做(期望初始化)与本地线程完全相同.
| 归档时间: |
|
| 查看次数: |
2007 次 |
| 最近记录: |