【问题标题】:Keeping the same thread name over RMI在 RMI 上保持相同的线程名称
【发布时间】:2010-07-30 13:55:49
【问题描述】:

在进行 RMI 调用时,是否有任何整洁的方法来保持相同的线程名称?目前,如果我有一个进行 RMI 调用的命名线程,在 RMI 调用的服务器端,Thread.currentThread().getName() 会返回类似“RMI TCP Connection(4)-10.0.0.2”之类的不明确信息。

当然,我可以在我所有的 RMI 方法中添加一个参数 String callingThreadName,然后将每个 RMI 方法实现的第一行设为 Thread.currentThread().setName(callingThreadName),但这并不是最简洁的方法。有什么方法可以至少获得通过 RMI 连接传输的线程名称背后的一些含义?

【问题讨论】:

  • 请问您为什么要这样做?为什么在服务器端处理请求的线程的名称甚至很重要?您可能正在尝试解决真正问题的副作用。
  • 正如Romain下面猜测的那样,主要是在不同的日志文件中一致地跟踪线程。该系统是一个分布式计算 - 每个工作机器创建一个对象,其中包含一个方法,该方法由来自主服务器的多个线程调用以执行实际计算。由于计算的性质,线程需要在 master 和 worker 之间来回切换,所以在 worker 上启动线程会让我在 master 上遇到同样的问题。

标签: java multithreading rmi


【解决方案1】:

您正在尝试做的是在查看日志文件时关联不同进程中的操作。最好的方法是向您的 RPC 添加一个唯一的 transaction_id,仅用于该目的。这使您可以跟踪通过系统的流量。

【讨论】:

  • 有一个唯一的事务 ID,但它部分基于线程名称(并在服务器上生成)。即使生成了一个单独的参数并将其添加到传递的内容中,这将如何改进原始问题中建议的解决方案(如果有的话,这将是一个额外的参数来拖入辅助方法,而线程名称“免费”)。
  • @Scott 线程通常是池化的,此外,如果您使用 RMI,则您正在跨多个进程工作。除非您将值传递给被调用者以将线程名称更改为,否则无法保持 ThreadID 同步。此外,由于您在 ThreadPool 中操作,因此您需要为每个调用设置名称。无论如何尝试这样做没有任何好处。在您的调用中传递一个事务 ID,然后在您的被调用者中设置一个 ThreadLocal 变量(如果需要并使用它)。忘记线程 ID 或名称。
【解决方案2】:

Java RMI 规范明确指出,不能保证客户端调用如何映射到服务器线程。所以你不能对它做任何假设。具体来说,您不应该尝试使用线程标识符来关联客户端。

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 2021-11-17
    • 1970-01-01
    • 2022-06-17
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多