【问题标题】:Thread names--when do you need to know them?线程名称——你什么时候需要知道它们?
【发布时间】:2009-04-18 06:45:42
【问题描述】:

不久前,我创建了一个关于 naming conventions for threads 的 SO 问题。问题类似于“你应该如何命名一个线程?”

回首往事,线程名称只有在您必须阅读线程名称时才重要。

您能否提供真实世界的示例,说明您何时必须检查线程并根据它们的名称来辨别它们?这与平台/框架无关。

你是如何(在什么环境下)做到这一点的?

换句话说,在什么情况下您必须解决问题并且必须按名称检查线程,您是如何做到这一点的?

【问题讨论】:

  • 一般线程名只对日志记录和调试有用。
  • 好的,那么,具体来说,您如何使用线程名称进行日志记录或调试?哪些日志记录或调试机制可以告诉您线程的名称,这对您有何帮助?
  • 这与平台无关。在 Windows 下不能命名线程。
  • 是的,你可以。使用 SetThreadName:stackoverflow.com/questions/478875/…
  • Linux中如何设置线程名的相关问题:stackoverflow.com/questions/778085/…

标签: multithreading


【解决方案1】:

在 Java 中查找连接泄漏时,有时跟踪一个对象以查看它是由哪个线程创建的很有用。在我们的例子中,它是 Finalizer 线程。这使我们得出结论,事情正在被垃圾收集,但没有足够快地完成。即一堆东西正在等待完成,这一切都在一个线程中完成。

因此,我们吸取了关于不依赖 Finalize 的教训。

【讨论】:

  • 是的,永远不要依赖 finalize 或任何类型的析构函数来清理关键资源!
【解决方案2】:

这个问题目前没有明显的原因被标记为“linux”......无论如何,如果您使用的是 Visual Studio,线程名称会出现在调试器的线程窗口中,所以如果您正在调试应用程序大量的线程,这个名字使得在调试器的这个窗口中找到“你关心的线程”变得超级容易。

简而言之,我只是使用它,因为它可以与调试器工具很好地交互。

【讨论】:

    【解决方案3】:

    有时在 Java EE 应用程序服务器上,能够跟踪单个线程上的所有活动很有用,这些活动通常由池子系统赋予适当的名称,例如。 'http-25'、'http-12' 等等。

    【讨论】:

      【解决方案4】:

      对生产服务器进行线程转储以确定挂起/减速的原因通常真的很有用。在这种情况下,通常会有大量不同角色的线程。在 Java 应用程序中,您可能正在查看应用程序用来建立性能保证的石英线程和可能的不同线程池。可以说,线程池名称通常比实际线程名称更重要,但如果您尝试识别死锁线程,则各个线程名称也可能很重要。由于线程通常有一个表明其角色的名称,因此有助于理解发生了什么。

      【讨论】:

        【解决方案5】:

        我正在使用线程名称来帮助调试使用 Orocos 工具链编写的多线程机器人控制应用程序的实时性能。每个组件都在一个单独的线程中运行,我将编写 shell 脚本,使用通用工具来管理线程的优先级以及它们运行在哪些内核上(因此,间接地,哪些线程抢占了其他线程,以及何时)。这样做的好处是您可以在程序运行时调整程序的性能,如果您还设置了连续输出的性能指标,这将特别有用。

        【讨论】:

          猜你喜欢
          • 2018-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-04
          • 2018-01-21
          • 2021-08-18
          • 2019-07-17
          相关资源
          最近更新 更多