获取Java 1.4中Thread的唯一标识符

时间:2009-03-31 14:26:39

标签: java multithreading uniqueidentifier

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

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

4 个答案:

答案 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 因此,根据您的需要,您可能必须实施以下两者的命名策略:

  • 对于给定的运行时会话是唯一的
  • 从会话重用
  • 仍然链接到1.4 JVM管理的内部原始命名策略(“Thread-1”,“Thread-2”,...)

答案 3 :(得分:2)

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

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