2011-10-19 3 views
0

LocalThread<T>の使い方の例をJDK 1.6ドキュメントに示します。私はここにコピーして貼り付けます:ThreadLocal <T> JDKのドキュメント

たとえば、以下のクラスは各スレッドに固有の固有の識別子を生成します。スレッドのIDは、最初にUniqueThreadIdGenerator.getCurrentThreadId()を呼び出したときに割り当てられ、以降の呼び出しで変更されません。

import java.util.concurrent.atomic.AtomicInteger; 

public class UniqueThreadIdGenerator {  
    private static final AtomicInteger uniqueId = new AtomicInteger(0);  
    private static final ThreadLocal <Integer> uniqueNum = 
     new ThreadLocal <Integer>() { 
      @Override 
      protected Integer initialValue() { 
       return uniqueId.getAndIncrement(); 
     } 
    }; 

    public static int getCurrentThreadId() { 
     return uniqueId.get(); 
    } 
} // UniqueThreadIdGenerator 

私の問題は、次のとおりです。

複数のスレッドが何の初期化はありませんので、それが唯一の0を返すUniqueThreadIdGenerator.getCurrentThreadId()呼び出すとき。

public static int getCurrentThreadId() { 
    return uniqueNum.get(); 
} 

これで、最初の呼び出しの後、変数が初期化されます。

+1

一意のIDを生成する代わりに、各スレッドが既に持つ一意のIDを使用できます。 'long id = Thread.currentThread()。getId();' –

答えて

5

はい、それはuniqueNum.get()である必要があります。 JDK 7 docsは右のそれを取得し、より良い名前を使用します。

import java.util.concurrent.atomic.AtomicInteger; 

public class ThreadId { 
    // Atomic integer containing the next thread ID to be assigned 
    private static final AtomicInteger nextId = new AtomicInteger(0); 

    // Thread local variable containing each thread's ID 
    private static final ThreadLocal<Integer> threadId = 
     new ThreadLocal<Integer>() { 
      @Override protected Integer initialValue() { 
       return nextId.getAndIncrement(); 
     } 
    }; 

    // Returns the current thread's unique ID, assigning it if necessary 
    public static int get() { 
     return threadId.get(); 
    } 
} 

これは、しかし、本当に初期の問題ではない - それは単に完全に間違ったメンバーを使用しての問題です。たとえ多くのコードを元のコードでuniqueNumに使用したとしても、getCurrentThreadId()は、 "現在のスレッドに割り当てられたID"ではなく、 "割り当てられる次のID"を常に返していました。

+0

おそらくThreadLocalの 'set'と' remove'メソッドをオーバーライドし、[UnsupportedOperationException]を投げるべきです(http://docs.oracle.com/javase /7/docs/api/java/lang/UnsupportedOperationException.html)。ちょっとした考え。 –