有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaAspectJ:如何获取线程名称?

我需要获取线程名并将它们记录在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

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


共 (5) 个答案

  1. # 1 楼答案

    **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. # 2 楼答案

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

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

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

  3. # 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. # 4 楼答案

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

    2这里您可以做些什么来识别执行该方法的线程:

    -初始化线程

        Thread t = new Thread(MyClass);     
    

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

    -命名执行线程

       t.setName("T1");
    

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

       public void go(){
    
         Thread.currentThread().getName();
    
      }
    
  5. # 5 楼答案

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

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