2017-08-18 1 views
0
public class App 
{ 
    public static void main(String[] args) 
    { 
     ThreadLocal<String> threadLocal = new ThreadLocal<String>(); 
     threadLocal.set("String1"); 
     threadLocal.set("String2"); 
     threadLocal.set("String3"); 

     System.out.println("=============="); 
     System.out.println("++ " + threadLocal.get()); 
     System.out.println("++ " + threadLocal.get()); 
    } 
} 


the output is 
============= 
++ String3 
++ String3 

ソースコードのsetメソッドを参照してください。指定されたThreadに対して、threadlocalmapは1つのマップエントリのみを保持できますか?サンプルが示すように、map.set(this、value);ここでは "this"はvar "threadLocal"なので、 "String3"は前の値を上書きします。 私はこれを間違えていますか?ThreadLocalソースコード混同

public void set(T value) { 
     Thread t = Thread.currentThread(); 
     ThreadLocalMap map = getMap(t); 
     if (map != null) 
      map.set(this, value);// here "this" is the var "threadLocal" 
     else 
      createMap(t, value); 
    } 
+0

はい、 'ThreadLocal'は、一度に1つの値を保持することができます。 – shmosel

+1

はまた、あなたの疑問を明確にし、「設定(T値)」メソッドの定義を参照するために「ThreadLocalの」ドキュメントを読むことができます。 https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html –

答えて

1

ThreadLocalは、現在のスレッドのローカルメンバー/変数です。各スレッドはちょうど1つの値を取得します。あなたはそれを文字列として設定されているあなたの例では、設定された値の種類に制限はありません。同時に

は、同じように、これは、クラス、コレクションのインスタンスであることができます。

あなたはすべての値は、あなたのコードから利用できるようにしたい

は、コレクション(リスト)、またはあなたが望むすべての値を収集するカスタムタイプでそれらを一緒に入れました。

1

ThreadLocalは、スレッドからの値にマッピングします。同じスレッドから同じキーを使用しているときに返される値はもちろん同じです。スレッドには常に同じ値を提供する:

これはThreadLocalをの目的です。