【问题标题】:Get unique identifier of a Thread in Java 1.4在 Java 1.4 中获取线程的唯一标识符
【发布时间】:2009-03-31 14:26:38
【问题描述】:

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

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

【问题讨论】:

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

标签: java multithreading uniqueidentifier


【解决方案1】:

Thread.getId(理论上可以overflow,但定义不可以,实际上不会)。

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

【讨论】:

  • 虽然这只是 Sun 的实现,但它可以更改为不仅仅是 ++ 并且实际上在重用方面更具侵略性。发生这种情况的几率可能很低,并且使用不同方法的 Classpath 项目说,不同实现的几率很小。
  • 类路径(它还没有死)和 Harmony 可以使用不同的、严重不合规的实现,但实际上这只是理论上的可能性。
  • @Tom Hawtin:但 API 文档明确指出,“当线程终止时,此线程 ID 可能会被重用。”
  • 哈,是的,我陷入了寻找错误的问题。没关系。
  • @Tom,这就是我要说的,有 Classpath 和其他实现可能无法模仿 Sun 实现所做的重用行为。如果没有指定行为,你怎么会有“严重不合规的实现”?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    如“Thread.getId() global uniqueness question”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”、...)

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-19
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多