5

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

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

4

4 回答 4

8

Thread.getId(理论上它可以溢出,但它被定义为不是,实际上也不会)。

1.5 现在正处于使用寿命结束期,但如果您使用的是旧的灰尘甲板 1.4,那么您可以使用ThreadLocal. (注意,不要太紧跟 Java SE 6 API 文档!)

于 2009-03-31T14:43:08.487 回答
3

你为什么需要这个?因为根据您的答案,有几种方法。

首先,了解线程的名称不能保证是唯一的。身份哈希码也不是。

如果您真的想将唯一 ID 与线程相关联,则需要自己进行。可能使用 IdentityHashMap。但是,这将引入一个您不希望在生产应用程序中闲逛的强大参考。

编辑:TofuBeer 的解决方案可能更好,尽管文档指出线程 ID 可以重复使用。

于 2009-03-31T14:43:38.047 回答
3

如“ 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。
因此,根据您的需要,您可能必须实施一个命名策略,它是:

  • 对于给定的运行时会话是唯一的
  • 在会话之间重用
  • 仍然链接到由 1.4 JVM 管理的内部原始命名策略(“Thread-1”、“Thread-2”、...)
于 2009-03-31T15:08:10.703 回答
2

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

是不是每次运行单元测试时都需要一个一致的值,或者只是一个唯一的值就足够了?

于 2009-03-31T14:43:19.407 回答