【问题标题】:AspectJ: how to get a Thread name?AspectJ:如何获得线程名称?
【发布时间】:2012-07-28 00:05:34
【问题描述】:

我需要获取线程名称并将它们记录在 AspectJ 类中。此解决方案不起作用

`@Around("call(void method*())")  
public Object condition(ProceedingJoinPoint joinPoint) throws Throwable 
{   
    PropertyConfigurator.configure("log4j.properties");

    long before = System.currentTimeMillis();
    Object res = joinPoint.proceed();
    long diff = System.currentTimeMillis() - before;

    logger.info(Thread.currentThread().getName() + "\t" + diff ); 

    return res;
}  

` 因为结果是例如:

main 717

我的方面是around一些方法。如何获取执行方法的线程名称(不是方面创建的线程)?

【问题讨论】:

    标签: java multithreading logging log4j aspectj


    【解决方案1】:

    我没有尝试重现线程情况,但我想另一种方法可能对您的情况更有帮助:您可以将您的 around 建议与介绍(又名inter-type declarations)结合起来。声明一个成员,将您要提取的线程信息存储在感兴趣的Runnable 类中,或者可能在它们调用的类中,并在您的日志记录建议中访问该信息。

    编辑:您可能希望使用ThreadLocal 来存储信息。 ;-)

    编辑 2:您是否尝试过使用execution() 切入点而不是call() 切入点来进入执行上下文并可能直接获取正在运行的线程而无需任何技巧?

    【讨论】:

      【解决方案2】:

      1.首先它的不是执行方法的线程,而是执行方法的线程。

      2. 您可以在此处识别执行该方法的线程:

      - 初始化线程。

          Thread t = new Thread(MyClass);     
      

      // MyClass 是分别扩展或实现 Thread 或 Runnable 的类。

      - 命名执行线程。

         t.setName("T1");
      

      - 在方法内部获取正在执行它的线程。

         public void go(){
      
           Thread.currentThread().getName();
      
        }
      

      【讨论】:

      • 我明白了我的错误。但我仍然无法解决我的问题。 ThreadA 中有methodA,ThreadB 中有我的methodB(AspectJ 类中的B)是@aroundmethodA。如何在methodB中获取ThreadA名称?
      • 嗯,就像这样...methodA 不能在 ThreadA 中但在 A 类中,methodB 不能在 ThreadB 但在 B 类中。现在 A 类中的 Thread 可以访问 B 类中的方法,反之亦然反之亦然.. 然后就这样,正如我在回答中提到的那样。
      【解决方案3】:

      无论您在哪里创建线程,都将其名称设置为您想要的格式,如下所示,否则它将给出默认分配的名称。

      public static void main(String[] args) {
      
          System.out.println("Thread : "+Thread.currentThread().getName());
          Thread.currentThread().setName("My Main Thread");
      
          Thread t1=new Thread(new Runnable() {
      
              @Override
              public void run() {
                  System.out.println("Thread : "+Thread.currentThread().getName());
      
              }
          });
          t1.setName("t1 thread");
          System.out.println("Thread : "+Thread.currentThread().getName());
          t1.start();
      }
      

      结果:

      Thread : main
      Thread : My Main Thread
      Thread : t1 thread
      

      【讨论】:

      • 我正在寻找执行方法的线程的名称,而不是方面创建的线程。您的解决方案没有进入方面
      【解决方案4】:

      对我来说,当前的执行线程是 ma​​in 线程,它是 currentThread。如果要转储所有线程,请使用:

       public static String getDumpFor(Thread thread) {
          StringBuilder st = new StringBuilder();
          if (thread.isAlive()) {
              StackTraceElement[] stackTrace = thread.getStackTrace();
              st.append(thread.toString()).append("\n")
                      .append(String.format(" State - %s,", thread.getState()))
                      .append(String.format(" Is daemon = %s,", thread.isDaemon()));
              for (StackTraceElement s : stackTrace)
                  st.append("\tat ").append(s.getClassName()).append(".").append(s.getMethodName()).append("(").append(s.getFileName()).append(":").append(s.getLineNumber()).append(")")
                          .append("\n");
          } else {
              st.append(" No thread ");
          }
          return st.toString();
      }
      
      /**
       * print thread dump for each active thread over logger API.
       */
      public static void dumpActiveThreads() {
          Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces();
          Set<Thread> keySet = stackTraces.keySet();
          System.out.println("\nThread dump begin:");
          for (Thread thread : keySet)
              dumpActiveThread(thread);
          System.out.println("\nThread dump end.");
      
      }
      

      但是我仍然可能误解了“如何获得真正的线程名称?”这个问题......

      【讨论】:

      • 我会尝试更具体一点:我正在寻找执行方法的线程的名称,而不是方面创建的线程。 joinPoint 内需要的线程名。
      【解决方案5】:
      **You can setName() method** 
      
      
      
        //get currently running thread object
                      Thread currentThread = Thread.currentThread();
                      System.out.println(currentThread);
      
                      /*
                       * To set name of thread, use
                       * void setName(String threadName) method of
                       * Thread class.
                       */
      
                      currentThread.setName("Set Thread Name Example");
      
      
      
      public void run() {
        System.out.println(th.getName()+" is starting.....");
        System.out.println("Current thread name : "+
        Thread.currentThread().getName());
        }
      

      【讨论】:

      • 与aspect有什么关系?我看不出我怎么能这样进入这个方面。
      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 2021-07-04
      相关资源
      最近更新 更多