在 Java 1.4 中,有没有比使用更好的获取线程 ID 的方法Thread.getName()
?
我的意思是,getName()
在单元测试中返回类似的东西"Thread-1"
,但在 WebLogic 10 中我得到"[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml"
.
在 Java 1.4 中,有没有比使用更好的获取线程 ID 的方法Thread.getName()
?
我的意思是,getName()
在单元测试中返回类似的东西"Thread-1"
,但在 WebLogic 10 中我得到"[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml"
.
Thread.getId(理论上它可以溢出,但它被定义为不是,实际上也不会)。
1.5 现在正处于使用寿命结束期,但如果您使用的是旧的灰尘甲板 1.4,那么您可以使用ThreadLocal
. (注意,不要太紧跟 Java SE 6 API 文档!)
你为什么需要这个?因为根据您的答案,有几种方法。
首先,了解线程的名称不能保证是唯一的。身份哈希码也不是。
如果您真的想将唯一 ID 与线程相关联,则需要自己进行。可能使用 IdentityHashMap。但是,这将引入一个您不希望在生产应用程序中闲逛的强大参考。
编辑:TofuBeer 的解决方案可能更好,尽管文档指出线程 ID 可以重复使用。
如“ Thread.getId() 全局唯一性问题” SO问题中所述,并由Thread.java的源代码确认:
/* For generating thread ID */
private static long threadSeqNumber;
/* Set thread ID */
tid = nextThreadID();
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
如果你还在java1.4中,线程id很容易自己实现。
然而,这种实现意味着当您多次运行程序时,给定线程将不会具有相同的 id。
因此,根据您的需要,您可能必须实施一个命名策略,它是:
如果您使用的是 JDK 1.5 或更高版本,则可以使用getID 。
是不是每次运行单元测试时都需要一个一致的值,或者只是一个唯一的值就足够了?