gpt4 book ai didi

java - Thread.setName(name) 注意事项

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:15 30 4
gpt4 key购买 nike

我有一个使用套接字的多线程客户端服务器应用程序。当找到新的连接时,进一步的执行将转移到使用新的 Executors 线程池的新线程。

我想在该客户端的所有日志语句中记录客户端 ID。问题是我不想仅仅为了传递客户端 ID 而修改方法签名。

我想到的解决方案是:

  1. 使用 ThreadLocal 来保存客户端值。
  2. 在 run() 中,我可以使用 Thread.currentThread().setName(clientId); 将客户端 ID 设置到线程中;

第一个应该可以。但我喜欢第二种选择,因为一种。我可以从调试器中找到客户端 IDb.记录器库可以配置为显示线程名称。因此不需要对日志语句进行任何更改,它也适用于库内的记录器。

除了 javadoc 中提到的那些之外,使用 thread.setName() 的注意事项有哪些?它如何影响性能?调用 thread.setName() 的峰值频率约为每秒 200 次,平均约为每秒 0.3 次。

最佳答案

如果你使用 Log4j,有一个特定的机制来处理这种类型的日志记录模式,分为两个类 org.apache.log4j.NDCorg.apache.log4j.MDC (“嵌套和映射的诊断上下文”)。

浏览NDC vs MDC - Which one should I use?看看哪个最适合您的特定情况。

这是另一个链接,它更详细地描述了 MDC 的使用:Build Flexible Logs With log4j - O'Reilly Media

请注意,MDC/NDC 使用的底层存储机制(我相信)无论如何都是 ThreadLocal。

关于java - Thread.setName(name) 注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5532864/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com