java - 为应用程序中的所有线程设置 ThreadContext

标签 java multithreading log4j log4j2

来自这个答案https://stackoverflow.com/a/25125159/4367326我有 routingAppender 工作,但我想为程序中的每个线程设置 ThreadContext

当我设置

ThreadContext.put("logFileName", "TestLogFile");

它按预期适用于主线程和日志,但不适用于我的应用程序中的任何其他线程。我怎样才能做到这一点?

最佳答案

如果您将系统属性 isThreadContextMapInheritable 设置为 true,则每个子线程都将继承父线程的 ThreadContext 状态。但这对执行器不起作用,因此您需要手动将数据从一个线程复制到另一个线程。

更新#2

你可以这样做:

public abstract class ThreadContextRunnable implements Runnable {

  private final Map context = ThreadContext.getContext();

  @Override
  public final void run() {
    if (context != null) {
      ThreadContext.putAll(context);
    }
    try {
      runWithContext();
    } finally {
      ThreadContext.clearAll();
    }
  }

  protected abstract void runWithContext();
}

然后你只需要实现 runWithContext 方法。

关于java - 为应用程序中的所有线程设置 ThreadContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40423667/

相关文章:

java - 将 Java 类加载器与 native 库的动态加载进行比较

java - 程序启动后启动 Java 代理

java - 同步方法退出时发生

java - 在小程序上显示旋转的风扇

java - Log4j2 登录到用户主文件夹

java - log4j 无法使用我的 log4j.properties 进行初始化

java - 创建一个最多包含 100 个值的 java 列表

java - 如何指定最大下载大小?

c++ - 为什么包含 rand() 的这段 C++11 代码在多线程中比在单线程中慢?

tomcat - Grails + log4j :ERROR WARNING: Exception occured configuring log4j logging: No such property: delegate for class: java. lang.String