2011-10-19 1 views
0

JDK 1.6 설명서에는 LocalThread<T>의 사용 방법에 대한 예제가 나와 있습니다. 복사하여 여기에 붙여 넣으십시오.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). 그냥 생각. –