为什么,例如Thread.currentThread().getId()
会返回一个长的?
这真的需要64位吗?就像我将要有一台运行这么多线程的机器一样!
说真的,这是一个很痛苦,因为我正在写一些跟踪线程标识符和其他位的东西,我真的不必使用这么长的数字,否则我必须使用的唯一键生成是巨大的。
或许有长期回归的公约;像前48位总是零。我在互联网上挖掘但没有发现任何东西。希望如此;有人知道吗?
感谢。
答案 0 :(得分:6)
此代码:
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
应该提供有关原因的见解。基本上线程ID是由一个运行的计数器分配的,所以如果你没有在很长一段时间内终止你的JVM,这个数字就会超过long。我只能想象他们这样做是为了减少长时间运行线程中发生冲突的可能性。
答案 1 :(得分: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
更安全一点:)