[英]ThreadLocal and list doesn't work
我的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()
在一个新的独立线程中调用run()
。 实际上,所有“线程”都在同一个线程中执行。
这里有两个问题。
1)您不能通过直接调用run
方法来执行新的Thread
。 这会跳过“魔术”并在主线程中调用run方法。 您看到的所有内容都发生在同一个线程中,因此只有一个ThreadLocal
列表。
要使新Thread
执行,您必须调用start
2)你不能在同一个Thread
上多次调用'start',因此你无法测试你正在尝试的多次调用。 你必须每次都创建新的Thread对象,但这意味着,他们显然不会共享ThreadLocal
变量,我猜你试图测试
你看,似乎这些线程实际上共享相同的列表,但我不明白为什么。
原因是你实际上并没有创建任何新线程。 所有代码都使用主线程运行(因此,您看到的行为是完全可以预期的)。
您需要启动正在运行的新线程:
更换:
th1.run();
th2.run();
th1.run();
th2.run();
th1.run();
th2.run();
th1.run();
th2.run();
附:
th1.start();
th2.start();
但是在尝试解释输出时要小心。 由于线程将同时运行,因此可以混合对控制台的写入。
并且你不能在启动后删除相同的Thread对象,你必须重新创建它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.