gpt4 book ai didi

java - 为什么ThreadLocal不在新线程中创建?

转载 作者:行者123 更新时间:2023-11-30 01:53:23 25 4
gpt4 key购买 nike

创建 Collector 类是为了生成带有值的 map (例如)。需要 Collector 包含资源,并且只能由当前线程访问。

Collector 类如下所示:

public class Collector    
{
ThreadLocal<Map<String, String>> storage;
public Map<String, String> collection(int id) {
storage = new ThreadLocal<>();
storage.set(new HashMap<>());
for (int i = id * 100; i <= id * 1000; i+=id * 100)
{
storage.get().put(String.valueOf(i), "test");
}
return storage.get();
}
}

我尝试执行方法collection(int id)同时在不同的线程中。我的建议是基于the official documentation 。但有时会抛出NullPointerException,我的观察指出由另一个线程重新创建ThreadLocal,因此NullPointerException抛出storage.get().put(String.valueOf(i), "test"); ,因为在 storage = new ThreadLocal<>(); 行的另一个线程中被重新初始化。

下面提供了运行两个线程的代码:

Collector collector = new Collector();
new Thread(new Runnable()
{
@Override
public void run()
{
System.out.println(collector.collection(1));
}
}).start();
new Thread(new Runnable()
{
@Override
public void run()
{
System.out.println(collector.collection(2));
}
}).start();

如何使用 ThreadLocal 在每个线程中拥有本地资源,从而独立于其他线程?

最佳答案

问题是您正在重新创建一个新的 ThreadLocal每次实例

collection(int)

调用方法,

this.storage = new ThreadLocal<>();

ThreadLocal<Map<String, String>>可以是一个类static字段

private final static ThreadLocal<Map<String, String>> STORAGE = new ThreadLocal<>();

设置并获取 Thread的关联值,只需使用

// You're better off passing and using an already constructed instance
STORAGE.set(new HashMap<>());
STORAGE.get();

关于java - 为什么ThreadLocal不在新线程中创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55300575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com