2

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
----------------------------------------------------

これらのスレッドが実際にはまったく同じリストを共有しているように見えますが、その理由はわかりません。

任意のヒント?

4

4 に答える 4

2

ここには 2 つの問題があります。

1)メソッドを直接Thread呼び出してnew を実行することはできません。runこれは「魔法」をスキップし、メインスレッド内で run メソッドを呼び出すだけです。結果として、表示されているものはすべて同じスレッドで発生しているため、ThreadLocalリストは 1 つだけです。

newThreadを実行するには、呼び出す必要がありますstart

2) 同じ で「開始」を複数回Thread呼び出すことはできないため、試行している複数の呼び出しをテストすることはできません。毎回新しい Thread オブジェクトを作成する必要がありますが、これは明らかにThreadLocal変数を共有していないことを意味します。これは、テストしようとしていると思います

于 2013-09-05T08:24:16.487 に答える
0

また、開始後に同じ Thread オブジェクトを開始することはできません。再作成する必要があります。

于 2013-09-05T08:24:02.940 に答える