如何暂时将字段线程设为本地 [英] how to temporarily make a field thread local

查看:72
本文介绍了如何暂时将字段线程设为本地的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的类是这样的,基本上我正在编写一个servlet,并且我想更改连接到servlet的特定用户的日志级别,并保持其他用户的其他日志设置不变,因为服务器将产生一个线程为了服务一个客户,我正在编写仅使用线程的演示代码

My class is like this, basically I'm writing a servlet, and I want to change the log level for a specific user connected to my servlet and leave other log settings for other user unchanged, since the server will produce one thread to serve one client, I'm writing demo code use only threads

public Class A implements Runnable {
    Logger myLogger = new Logger();

    @Override
    public void run() {
        if (Thread.currentThread.getName()).equals("something") {
            // some code that makes myLogger thread-local so I can change 
            // myLogger settings without affecting other threads
        }
        myLogger.debug("some debug information");
    }
}

有什么想法怎么做?

推荐答案

似乎可以通过这种方式完成

Seems like this could be done in this way

 public Class A implements Runnable {
    private static final ThreadLocal<Logger> logger = new ThreadLocal<Logger>(){
       //return your desired logger
       }

     @Override
     public void run() {
       //check condition and change logger if required
       //check if that particular servlet and user also 
        if (Thread.currentThread.getName().equals("something") && user.getId() ==XX) {
         ConsoleAppender a = (ConsoleAppender) Logger.getRootLogger().getAppender("stdout");
         a.setLayout(new PatternLayout("%d{HH:mm:ss}  %-5.5p  %t %m%n"));
       }
     }
  }

有关更多信息: 何时以及如何使用ThreadLocal变量?

java doc 用于本地线程指出每个访问一个线程(通过其get或set方法)的线程都有其自己的,独立初始化的变量

java doc for Thread Local states that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable more.

这篇关于如何暂时将字段线程设为本地的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆