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

私はスレッド化の状況を再現しようとはしていませんが、あなたの状況では別のアプローチがより役立つかもしれないと思います.あなたのaroundアドバイスを紹介と組み合わせることができます(別名インタータイプ宣言)。Runnable対象のクラスまたはそれらによって呼び出されるクラスで抽出するスレッド情報を格納するメンバーを宣言し、ロギング アドバイスでその情報にアクセスします。

編集:ThreadLocal情報を保存するために a を使用したい場合があります。;-)

編集 2:実行中のコンテキストに入るためにexecution()、ポイントカットの代わりにポイントカットを使用しようとしたことがありますか?call()

于 2012-08-09T10:05:17.240 に答える
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
**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

現在の実行スレッドは、 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.");

}

ただし、「実際のスレッド名を取得するにはどうすればよいですか?」という質問をまだ誤解している可能性があります...

于 2012-07-30T10:26:09.297 に答える