我遇到了一个问题,即创建ThreadLocal并使用新的ThreadLocal进行初始化。问题是,我在概念上只想要一个持久的列表,这个列表会延续线程的生命,但我不知道是否有一种方法可以在Java中初始化每个线程的东西。
E.g。我想要的是:
ThreadLocal static {
myThreadLocalVariable.set(new ArrayList<Whatever>());
}
因此它为每个线程初始化它。我知道我可以这样做:
private static Whatever getMyVariable() {
Whatever w = myThreadLocalVariable.get();
if(w == null) {
w = new ArrayList<Whatever>();
myThreadLocalVariable.set(w);
}
return w;
}
但是我每次使用它时都不需要检查它。我能在这做什么更好的事情吗?
答案 0 :(得分:31)
您只需覆盖initialValue()
方法:
private static ThreadLocal<List<String>> myThreadLocal =
new ThreadLocal<List<String>>() {
@Override public List<String> initialValue() {
return new ArrayList<String>();
}
};
答案 1 :(得分:17)
你的解决方案很好。一点点简化:
private static Whatever getMyVariable()
{
Whatever w = myThreadLocalVariable.get();
if(w == null)
myThreadLocalVariable.set(w=new Whatever());
return w;
}
在Java 8中,我们可以做到:
ThreadLocal<ArrayList<Whatever>> myThreadLocal = ThreadLocal.withInitial(ArrayList::new);
使用Supplier<T>
功能界面。
答案 2 :(得分:9)
JDK8中已接受的答案已过时。这是自那时以来最好的方式:
private static final ThreadLocal<List<Foo>> A_LIST =
ThreadLocal.withInitial(ArrayList::new);