Java 1.4中获取线程唯一标识符

5

在Java 1.4中,获取线程ID是否有比使用Thread.getName()更好的方法?

我的意思是,在单元测试中,getName()返回类似于"Thread-1"的内容,但在WebLogic 10中,我会得到"[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml"


好的,我们需要更多信息。您对所有线程感兴趣还是只对您创建的线程感兴趣(听起来像是所有线程)?在每次运行单元测试时,您需要返回相同的值还是可以每次返回不同的值? - TofuBeer
4个回答

8

Thread.getId(理论上可能会溢出,但在定义中不会并且实际上也不会发生)。

1.5版本目前已经进入其服务生命周期结束阶段,但如果您正在使用旧版本的1.4,则可以使用ThreadLocal来实现自己的版本。(注意,不要过于严格遵循Java SE 6 API文档!)


这只是Sun公司的实现而已,它可以被改变,不仅仅是++,而且可以积极地重复使用。发生这种情况的可能性很低,而使用不同方法的不同实现(比如Classpath项目)的可能性也很小。 - TofuBeer
Classpath(难道还没死吗)和Harmony可能会使用不同的且极不兼容的实现,但在实践中这只是一种理论上的可能性。 - Tom Hawtin - tackline
@Tom Hawtin:但是API文档明确指出,“当线程终止时,此线程ID可能会被重用。” - Michael Myers
哈,是的,我陷入看错问题的困境了。不用管它了。 - Michael Myers
@Tom,这就是我说的,有Classpath和其他实现可能不会模仿Sun实现的重用行为。如果没有指定行为,你怎么能有“明显不符合规范的实现”呢? - TofuBeer

3
为什么需要这个?因为根据您的回答,有几种不同的方法。首先,了解线程名称不保证唯一性。身份哈希码也是如此。如果您真的想将唯一ID与线程关联起来,您需要自己这样做。可能使用IdentityHashMap。然而,这会引入一个强引用,在生产应用程序中是不想要的。编辑:TofuBeer有一个更好的解决方案,尽管文档指出线程ID可能被重用。

3

如在“Thread.getId()全局唯一性问题”中提到的,并通过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。
因此,根据你的需要,你可能需要实现一个命名策略,该策略同时具备以下特点:

  • 对于给定的运行时会话是唯一的
  • 从会话到会话被重复使用
  • 仍然与由1.4 JVM管理的内部原始命名策略相关联("Thread-1", "Thread-2", ...)

2

如果您使用的是JDK 1.5或更高版本,可以使用getID

您是否需要每次运行单元测试时都获得一致的值,或者仅仅需要一个唯一的值就足够了?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接