13

如果多个 Java 应用程序在一个系统上运行,那么每个线程 ID 是否相对于所有其他 Java 线程是唯一的,无论它们在哪个应用程序中运行?

Java 应用程序相对于其他 Java 应用程序应该是沙盒的,所以我认为线程 ID 可能会发生冲突。

如果线程 ID 在所有应用程序中都是唯一的,那不会泄露一些(尽管非常少)有关系统上其他应用程序的信息吗?例如在其他应用程序中启动了多少线程,或者即使其他 Java 应用程序正在运行?

4

2 回答 2

24

好吧,让我检查一下来源。

Thread'sinit方法中(由每个构造函数调用):

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

nextThreadID()

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

和:

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

threadSeqNumber初始化为 0(默认long值),因此返回的第一个值nextThreadID是 1。

因此,线程 ID 编号始终从 1 开始并以 1 递增。换句话说,您的问题的答案是它们不是全局唯一的。

于 2009-02-26T17:50:24.257 回答
8

根据 JDK 源,线程 ID 在给定的 JVM 中是唯一的 - 实际上,它只是作为运行序列实现的。

这是 1.6.0_10 中的 nextThreadID() 方法:

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

(实际上可能有一个很长的溢出错误,大概它从未真正发生过)

于 2009-02-26T17:51:21.023 回答