[英]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.