Получить уникальный идентификатор потока в Java 1.4 - PullRequest
5 голосов
/ 31 марта 2009

В Java 1.4 есть ли лучший способ получить идентификатор потока, чем использование Thread.getName()?

Я имею в виду, getName() в модульных тестах возвращает что-то вроде "Thread-1", но в WebLogic 10 я получаю "[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml".

Ответы [ 4 ]

8 голосов
/ 31 марта 2009

Thread.getId (теоретически может переполниться , но определено не так и на практике не будет).

1.5 сейчас переживает период окончания срока службы, но если вы используете старые пыльные колоды 1.4, вы можете реализовать свою собственную с помощью ThreadLocal. (Обратите внимание, не следуйте документам Java SE 6 API слишком внимательно!)

3 голосов
/ 31 марта 2009

Как уже упоминалось в " Thread.getId () глобальном вопросе уникальности " ТАК ​​вопрос, и подтверждается исходным кодом Thread.java :

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

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

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

Идентификатор потока очень просто реализовать, если вы все еще в java1.4.
Однако эта реализация означает, что данный поток не будет иметь тот же идентификатор, когда вы запускаете свою программу несколько раз.
Поэтому, в зависимости от того, что вам нужно, вам, возможно, придется реализовать политику именования, которая будет:

  • уникально для данного сеанса во время выполнения
  • повторно используется от сеанса к сеансу
  • по-прежнему связан с внутренней исходной политикой именования, управляемой JVM 1.4 («Thread-1», «Thread-2», ...)
3 голосов
/ 31 марта 2009

Зачем тебе это? Потому что в зависимости от вашего ответа есть несколько подходов.

Во-первых, следует понимать, что имя потока не обязательно должно быть уникальным. И хэш-код идентичности.

Если вы действительно хотите связать уникальный идентификатор с потоком, вам нужно будет сделать это самостоятельно. Вероятно, используя IdentityHashMap. Тем не менее, это приведет к серьезным ссылкам, которые вы не хотите использовать в производственном приложении.

Редактировать: TofuBeer предлагает решение, которое, вероятно, лучше, хотя в документах отмечается, что идентификаторы потоков можно использовать повторно.

2 голосов
/ 31 марта 2009

Вы можете использовать getID , если вы используете JDK 1.5 или выше.

Это тот случай, когда вам нужно постоянное значение при каждом запуске модульных тестов, или достаточно просто уникального значения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...