5

例如,为什么Thread.currentThread().getId()返回一个 long ?

这真的需要64位吗?就像我将永远拥有一台运行这么多线程的机器!

说真的,这有点痛苦,因为我正在编写一些东西来跟踪线程标识符以及其他位,我真的不想使用这么长的数字,否则我必须生成的唯一密钥是巨大的.

也许有关于长期回报的约定;就像前 48 位总是零一样。我在互联网上进行了挖掘,但没有找到任何东西。但愿如此; 有人有确切消息么?

谢谢。

4

2 回答 2

6

这段代码:

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

应该提供有关原因的见解。本质上,线程 ID 是由运行中的计数器分配的,因此如果您在很长一段时间内没有终止 JVM,那么这个数字将超过 long。我只能想象他们这样做是为了减少长时间运行的线程中发生冲突的机会。

于 2013-05-23T14:11:28.653 回答
1

Java 应用程序相对于其他 Java 应用程序是沙盒的,这是线程 ID 甚至可能发生冲突的方式。

线程并不意味着在所有应用程序中都是唯一的,它们仅在每个应用程序中都是唯一的。查看Thread.init源码中的方法,可以发现:

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

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

我想它是用来防止潜在的溢出错误的。随着线程的创建,数字最终会溢出。长只是存在

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

更安全一点:)

于 2013-05-23T14:15:00.757 回答