2010-01-06 3 views
8

스레드 대신 스레드 그룹에서 작동하는 ThreadLocal과 비슷한 클래스를 찾고 있습니다.Java에 스레드 그룹 로컬 변수가 있습니까?

그런 클래스가 없다면 (일부 오픈 소스 라이브러리에서) 어떻게 구현하겠습니까? WeakHashMap에 스레드 그룹을 갖는 것보다 더 좋은 아이디어가 있습니까?

전역, 스레드 단위 및 스레드 단위 그룹 컨텍스트에서 다양한 매개 변수를 사용하여 런타임에 튜닝 할 수있는 디버깅 프레임 워크를 구현하고 있습니다.

debug.log(category, message); 

을 네트워크 요청을 처리 스레드 그룹의 스레드에 의해 호출 할 때 특정 카테고리와 로그 항목 만 표시되도록 지정 : 아주 간단한 예를 들어, 당신은보고 문을 가질 수 있습니다.

+1

명확한 설명을 위해 몇 가지 사용 예를 들어 볼 수 있습니다. 또한 왜/어떻게하고 싶은지. –

+0

@ 케빈 : 동기 부여와 간단한 예를 추가했습니다. – Viliam

답변

4

로컬 스레드에 값 보유자를 저장하고 동일한 그룹의 모든 스레드에 대해 동일한 값 보유자로 값 홀더를 초기화합니다.

public class ThreadGroupLocal<T> extends ThreadLocal<ValueHolder> { 
    private static class ValueHolder { 
     public Object value; 
    } 
    // Weak & Concurrent would be even the better, but Java API wont offer that :(
    private static ConcurrentMap<ThreadGroup, ValueHolder> map = new ConcurrentHashMap<ThreadGroup, ValueHolder>; 
    private static ValueHolder valueHolderForThread(Thread t) { 
     map.putIfAbsent(t.getThreadGroup(), new ValueHolder()); 
     return map.get(t.getThreadGroup()); 
    } 
    @Override 
    protected ValueHolder initialValue() { 
     return valueHolderForThread(Thread.currentThread()); 
    } 
    public T getValue() { (T) get().value; } 
    public void setValue(T value) { get().value = value; } 
} 

다음 (초기화에 대한 기대) 않습니다

ThreadGroupLocal<String> groupLocal = new ThreadGroupLocal<String>(); 
groupLocal.setValue("foo"); 
//... 
String foo = groupLocal.getValue(); 

를 사용하여 정확하게 지역 스레드처럼 수행합니다.

+0

왜 ValueHolder를 생성하지 않았습니까? 왜 ThreadLocal을 확장하게 만들었습니까? ThreadLocal 의 사용은 구현 세부 사항입니다. –

+0

좋은 점, 그들은 고려 가치가 있습니다. 나는 그 코드를 개념 증명으로 서둘러 썼다. 그래서 그것을 프로덕션에서 사용하기 전에 리뷰하고 테스트 해 보라. (추신 : * ValueHolder가 왜 생성되지 않았는지 기억합니다. 왜냐하면 그들은 ''으로 축퇴 될 정적 해시 맵에 저장되기 때문에 어쨌든 캐스팅해야합니다.*) – akuhn

+0

+1, 내가 찾고있는 것. 요즘 Java API가이 기능을 기본적으로 지원하는지 알고 있습니까? – dreamcrash

2

구현 (지난 몇 년 전)을 마지막으로 살펴본 시점에서 스레드 로컬은 스레드 ID로 인덱싱 된 간단한 해시 테이블로 구현되었습니다. C++의 효율성에서 공상과 수 멀리 떨어져있는 것은 없습니다.

동일한 작업을 수행하고 스레드 그룹 개체를 자신의 스레드 그룹 로컬 해시 테이블의 키로 사용할 수 있습니다.

+0

Even (Sun) 1.2가 업데이트되지 않도록 업데이트되었습니다. 매우 비효율적입니다. –

+0

예 오래 전이었습니다. – Lothar

+0

ThreadLocal 객체에 의해 인덱싱 된 Thread 인스턴스 내부의 해시 테이블이라고 생각합니다. 이렇게하면 스레드 당 하나의 개인 해시 테이블 인 동기화 오버 헤드가 제거됩니다. – Thilo

5

ThreadGroup은 거의 사용되지 않으므로 플랫폼 지원이 없습니다.

[Weak/Identity/Concurrent] HashMap<ThreadGroup,T>을 사용하면 매우 빠르게 작동하지 않을 수 있습니다. 당신은 정말로지도가 모든 약점, 정체성 및 동시성이되기를 원하지만 Java 라이브러리를 사용하면 현재 하나만 선택할 수 있습니다.

성능을 향상 시키려면 ThreadThreadGroup으로 변경되지 않습니다. 따라서 ThreadLocal (initialValue 재정의) 값을 캐시하십시오. ThreadLocal은 좋은 성능을 가지고 있습니다 (get).

+0

멋진 성능 트릭, 감사합니다. 성능 문제에 대해서는 – Viliam

+0

+1입니다. 요즘 Java API가이 기능을 기본적으로 지원하는지 알고 있습니까? – dreamcrash

관련 문제