2013-05-23 9 views
5

Dlaczego na przykład Thread.currentThread().getId() zwraca długi?Zwraca typ getId() na obiekcie wątku

Czy to naprawdę musi być 64-bitowe? Tak, jakbym kiedykolwiek miał maszynę z taką ilością wątków!

To poważny problem, ponieważ piszę coś, co pozwala śledzić identyfikatory wątków wraz z innymi bitami i wolałabym nie używać tak długiego numeru, w przeciwnym razie unikalny klucz, który mam generowanie jest ogromne.

Być może istnieje konwencja dotycząca długiego powrotu; tak jak pierwsze 48 bitów ma zawsze wartość zero. Miałem kopać w Internecie, ale nic nie znalazłem. Mam nadzieję; czy ktoś wie na pewno?

Dzięki.

+0

nr getId() będzie prawdopodobnie wrócić jakiś identyfikator bazowego systemu operacyjnego, więc trzeba dokładnie zerowy gwarancje dotyczące wartości. –

+0

Wydaje się, że dobrym pomysłem jest zaplanowanie przyszłości i uzyskanie naprawdę dużej liczby wątków. – Keppil

+0

Bo tak zaprojektowali to. Przeoczyłeś przypadek, w którym naprawdę zwraca 64-bitowy * wskaźnik *. Nie jest konstruktywny. – EJP

Odpowiedz

6

ten kod:

private static synchronized long nextThreadID() { 
    return ++threadSeqNumber; 
} 

powinno dać wgląd dlaczego. Zasadniczo identyfikatory wątków są przypisywane przez działający licznik, więc jeśli nie przerwiesz JVM na znaczną ilość czasu, liczba ta przekroczyłaby wartość długą. Mogę sobie tylko wyobrazić, że zrobili to, aby zmniejszyć ryzyko kolizji w długich wątkach.

+0

Dzięki za wyjaśnienie +1 i zaakceptuj za kilka minut. Czy jestem tu sam, myśląc, że to trochę wulgarne? – Bathsheba

+0

@Bathsheba moja odpowiedź jest wulgarna? – Woot4Moo

+0

Nie, jest idealny. Koncepcja robienia tak dużej liczby, że nie musimy się martwić o błąd, jest wulgarna, imo. – Bathsheba

1

Aplikacje Java są pakowane w piaskownicę w porównaniu do innych aplikacji Java, co może doprowadzić do kolizji ID wątków.

Wątki nie mają być unikalne we wszystkich aplikacjach, są tylko unikatowe dla każdej aplikacji. Patrząc na sposób w źródle Thread.init można znaleźć:

private static synchronized long nextThreadID() { 
    return ++threadSeqNumber; 
} 

/* For generating thread ID */ 
private static long threadSeqNumber; 

Chyba jest używany, aby zapobiec potencjalnej błąd przepełnienia. W miarę tworzenia wątków liczba będzie ostatecznie przepełniana. Długa jest po prostu

9223372036854775807(Max long value) - 2147483647(Max int value) = 9.223372e+18 

nieco bardziej bezpieczne :)

Powiązane problemy