2009-02-26 5 views
10

Если в системе работает несколько приложений Java, является ли каждый идентификатор потока уникальным относительно всех других потоков Java независимо от того, в каком приложении они работают?Thread.getId() глобальный вопрос уникальности

Приложения Java должны быть помечены в виде песка по сравнению с другими приложениями Java, поэтому я подумал, что возможно столкнуться с идентификаторами потоков.

Если идентификаторы потоков уникальны во всех приложениях, не будет ли утечка некоторой (хотя и очень незначительной) информации о других приложениях в системе? Например, сколько потоков было запущено в других приложениях или даже если другие приложения Java работают вообще?

+1

я должен, вероятно, F3 в методы в Eclipse, перед публикацией ... –

ответ

21

Хорошо, позвольте мне проверить источник.

В init методе Thread «s (который вызывается каждый конструктор):

/* Set thread ID */ 
tid = nextThreadID(); 

В nextThreadID():

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

И:

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

Он никогда не устанавливается , и, таким образом, по умолчанию используется значение 0.

Таким образом, очевидно, что идентификационные номера потоков всегда начинаются с 0 и увеличиваются на 1. Другими словами, ответ на ваш вопрос заключается в том, что они являются не глобально уникальным.

7

Согласно источнику JDK, идентификатор потока уникален в данной JVM - на самом деле он просто реализуется как последовательность выполнения.

Вот метод nextThreadID() из 1.6.0_10:

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

(там, наверное, на самом деле долго переполнения ошибка там, предположительно, это никогда не произошло на самом деле)

+0

Да, я думаю, маловероятно, что любая существующая система может запускать потоки 9223372036854775807. :) –

+0

Ему не нужно запускать их одновременно ... предположим, что есть система, которая создает новый поток каждую секунду (очевидно, это должен быть пул потоков, но предположим, что это не так). Это всего лишь 292471208677 лет непрерывной работы : P – Jared

+0

Нерест новой нити каждой миллисекунды займет 292 277,266 миллион до переполнения. –