gpt4 book ai didi

java - ThreadLocal 和列表不起作用

转载 作者:行者123 更新时间:2023-12-02 06:05:35 29 4
gpt4 key购买 nike

我的基于 ThreadLocal 的类遇到问题。任何帮助,将不胜感激。这是一个带有简单列表的基类:

public class ThreadLocalTest {

protected static final ThreadLocal<List<String>> thList = new ThreadLocal<List<String>>() {
protected List<String> initialValue() {
return new ArrayList<String>();
}
};

public static void put(String k) {
thList.get().add(k);
}

public static List<String> getList() {
return thList.get();
}

}

我正在这样测试:

Thread th1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("------------------thread1---------------------------");
ThreadLocalTest.put("a");
ThreadLocalTest.put("b");
List<String> l = ThreadLocalTest.getList();
System.out.println(l.size());
System.out.println("----------------------------------------------------");
}
});
Thread th2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("------------------thread2---------------------------");
ThreadLocalTest.put("c");
List<String> l = ThreadLocalTest.getList();
System.out.println(l.size());
System.out.println("----------------------------------------------------");
}
});
th1.run();
th2.run();
th1.run();
th2.run();
th1.run();
th2.run();
th1.run();
th2.run();

所以我得到的是:

------------------thread1---------------------------
2
----------------------------------------------------
------------------thread2---------------------------
3
----------------------------------------------------
------------------thread1---------------------------
5
----------------------------------------------------
------------------thread2---------------------------
6
----------------------------------------------------
------------------thread1---------------------------
8
----------------------------------------------------
------------------thread2---------------------------
9
----------------------------------------------------
------------------thread1---------------------------
11
----------------------------------------------------
------------------thread2---------------------------
12
----------------------------------------------------

您会发现这些线程实际上共享相同的列表,但我不明白为什么。

有什么建议吗?

最佳答案

您调用run()方法而不是start()run() 在调用它的同一线程中运行,而 start() 在新的单独线程中调用 run()。实际上,所有“线程”都在同一个线程中执行。

关于java - ThreadLocal 和列表不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18630950/

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