1

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

4

5 回答 5

1

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

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

- 初始化线程。

    Thread t = new Thread(MyClass);     

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

- 命名执行线程。

   t.setName("T1");

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

   public void go(){

     Thread.currentThread().getName();

  }
于 2012-07-30T10:43:57.013 回答
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());
  }
于 2012-07-30T10:26:09.260 回答
0

对我来说,当前的执行线程是当前线程的线程。如果要转储所有线程,请使用以下命令:

 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.");

}

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

于 2012-07-30T10:26:09.297 回答
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
于 2012-07-30T10:28:37.170 回答
0

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

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

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

于 2012-08-09T10:05:17.240 回答