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

获取Java 1.4中线程的唯一标识符,java,multithreading,uniqueidentifier,Java,Multithreading,Uniqueidentifier,在Java1.4中,有没有比使用Thread.getName()更好的获取线程ID的方法 我的意思是,单元测试中的getName()返回类似“Thread-1”,但在WebLogic 10中,我得到“[ACTIVE]ExecuteThread:'1'表示队列:'WebLogic.kernel.Default(self-tuning)'.xml”(理论上可以,但定义为不可以,实际上也不会) 1.5的使用寿命即将结束,但是如果您使用的是旧的dusty甲板1.4,那么您可以使用来实现自己的。(请注意,

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

我的意思是,单元测试中的
getName()
返回类似
“Thread-1”
,但在WebLogic 10中,我得到
“[ACTIVE]ExecuteThread:'1'表示队列:'WebLogic.kernel.Default(self-tuning)'.xml”

(理论上可以,但定义为不可以,实际上也不会)

1.5的使用寿命即将结束,但是如果您使用的是旧的dusty甲板1.4,那么您可以使用来实现自己的。(请注意,不要过于关注JavaSE6API文档!)

如果您使用的是JDK1.5或更高版本,则可以使用


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

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

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

如果你真的想把一个唯一的ID和一个线程关联起来,你需要自己去做。可能是用了一张身份地图。然而,这将引入一个强大的参考,你不希望在生产应用程序中出现

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

如“”问题中所述,并由以下源代码确认:

如果您的应用程序仍在java1.4中,线程id很容易自己实现。
但是,此实现意味着在多次运行程序时,给定的线程将不具有相同的id。
因此,根据您的需要,您可能必须实施一个命名策略,该策略包括:

  • 对于给定的运行时会话是唯一的
  • 在会话之间重复使用
  • 仍然链接到由1.4 JVM管理的内部原始命名策略(“线程1”、“线程2”…)

不过,这只是Sun的实现,可以将其更改为不简单的++,并且实际上在重用方面具有攻击性。发生这种情况的可能性很低,而使用不同方法的不同实现(如Classpath项目)的可能性很小。Classpath(难道它还没死)和Harmony可以使用不同的、极不兼容的实现,但在实践中,这只是一种理论上的可能性。@Tom Hawtin:但API文档特别指出,“当一个线程终止时,这个线程ID可能会被重用。”哈,是的,我被错误的问题缠住了。没关系。@Tom,这就是我要说的,有些类路径和其他实现可能不会模仿Sun实现的重用行为。如果没有指定行为,怎么会有“异常不兼容的实现”?好的,我们需要更多信息。您是对所有线程感兴趣,还是只对您创建的线程感兴趣(听起来像所有线程)?每次运行单元测试时是否需要返回相同的值,或者每次运行单元测试时返回的值是否不同?
/* For generating thread ID */
private static long threadSeqNumber;

/* Set thread ID */
tid = nextThreadID();

private static synchronized long nextThreadID() {
    return ++threadSeqNumber;
}