簡體   English   中英

ThreadLocal和列表不起作用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM