在Java 1.4中,有没有比使用Thread.getName()
更好的获取线程ID的方法?
我的意思是,单元测试中的getName()
返回类似"Thread-1"
的内容,但在WebLogic 10中,我得到"[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml"
。
答案 0 :(得分:8)
Thread.getId(理论上可以overflow,但它的定义不是,实际上也不会。)
1.5现在正在使用其服务终止期限,但如果您使用的是旧的尘埃甲板1.4,那么您可以使用ThreadLocal
实现自己的。 (注意,不要过于密切关注Java SE 6 API文档!)
答案 1 :(得分:3)
你为什么需要这个?因为根据你的答案,有几种方法。
首先,要了解线程的名称不能保证是唯一的。身份哈希码也不是。
如果您确实想要将唯一ID与线程相关联,那么您需要自己完成。可能使用IdentityHashMap。但是,这将引入一个强大的参考,您不希望在生产应用程序中闲逛。
编辑:TofuBeer的解决方案可能更好,尽管文档指出线程ID可以重复使用。
答案 2 :(得分:3)
如“Thread.getId() global uniqueness question”问题所述,并由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
因此,根据您的需要,您可能必须实施以下两者的命名策略:
答案 3 :(得分:2)
如果您使用的是JDK 1.5或更高版本,则可以使用getID。
是否每次运行单元测试时都需要一致的值,或者只是一个足够好的唯一值?