AspectJ:如何获取线程名称?

时间:2012-07-30 10:20:01

标签: java multithreading logging log4j aspectj

我需要获取线程名称并将它们记录在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一些方法。如何获取执行方法的线程的名称(不是由方面创建的线程)?

5 个答案:

答案 0 :(得分:1)

1。首先不是执行方法的线程,但是执行该方法的线程。

2。此处您可以执行识别 执行该方法的主题:

- 初始化帖子。

    Thread t = new Thread(MyClass);     

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

- 命名执行线程。

   t.setName("T1");

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

   public void go(){

     Thread.currentThread().getName();

  }

答案 1 :(得分:0)

**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());
  }

答案 2 :(得分:0)

对我来说,当前的执行线程是 main 线程,它是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.");

}

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

答案 3 :(得分:0)

无论您在哪里创建线程,都会以您想要的格式设置其名称,否则它将提供默认的指定名称。

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 :(得分:0)

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

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

编辑2:您是否尝试使用execution()切入点而不是call()切入点以便处于执行上下文中并且可能直接获取正在运行的线程任何技巧?