7

Javaでスレッド作成リスナーを書くことは可能ですか?たとえば、aopを使用しますか?!

つまり、アプリケーションがスレッドを作成する場合、このオブジェクトを自分のテーブルやコンテナなどに登録したいということです。

4

3 に答える 3

4

JVMで実行中のすべてのスレッドを継続的にリストするスレッドを作成します。
その後、新しいスレッドが出現したことに気付くたびに、コード内のクラスにいずれかの方法で通知します。

次に、JVMで現在実行されているすべてのスレッドを一覧表示する方法に関するリンクをいくつか示します。

  1. 現在Javaで実行されているすべてのスレッドのリストを取得する

  2. 実行中のすべてのスレッドの一覧表示

============

開始コード:

ThreadCreationListener.java

public interface ThreadCreationListener {
    public void onThreadCreation(Thread newThread);
}

ThreadCreationMonitor.java

public class ThreadCreationMonitor extends Thread {
   private List<ThreadCreationListener> listeners;
   private boolean canGo;

   public ThreadCreationMonitor() {
      listeners = new Vector<ThreadCreationListener>();//Vector class is used because many threads may use a ThreadCreationMonitor instance.
      canGo = true;
      // Initialize the rest of the class here...
   }

   // Most important methods
   public void addListener(ThreadCreationListener tcl) {
        listeners.add(tcl);
   }

   public void removeListener(ThreadCreationListener tcl) {
        listeners.remove(tcl);
   }

   public void run() {
        List<Thread> runningThreads;
        List<Thread> lastRunningThreads;

        while(canGo) {
            // Step 1 - List all running threads (see previous links)
            // runningThreads = ...

            // Step 2 - Check for new threads and notify all listeners if necessary
            if (runningThreads.removeAll(lastRunningThreads)==true) {
                for(Thread t : runningThreads) {
                    for(ThreadCreationListener tcl : listeners) {
                        tcl.onThreadCreation(t);//Notify listener
                    }
                }
            }
        }
   }

   public void shutdown() {
       canGo = false;
   }

}

MyThreadInfoConsumer.java

public class MyThreadInfoConsumer implements ThreadCreationListener {
    public void onThreadCreation(Thread newThread) {
        // Process here the notification...
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
       ThreadCreationMonitor tcm = new ThreadCreationMonitor();
       tcm.start();

       MyThreadInfoConsumer myTIC = new MyThreadInfoConsumer();
       tcm.addListener(myTIC);

       // rest of your code...
       // Don't forget to call tcm.shutdown() when exiting your application !
    }
}
于 2012-09-19T08:46:07.410 に答える
2

これはAOP(たとえばaspectj)で可能だと思います。ただし、アスペクトコンパイラを使用してJDKクラスを再コンパイルできない限り、独自の型ThreadおよびThreadGroup/型を作成する必要があります。スレッドの起動時に登録する場合はスレッドのメソッドに、スレッドオブジェクトの作成に登録する場合はプールExecutorのポイントカットを定義します。startcreateThread


以下は、アスペクトコンパイラを使用してJDKを再コンパイルした場合にのみ機能します。すべてのスレッドはで開始されるThread.startため、そのメソッドのポイントカットを記述してから、アドバイスを使用してやりたいことを実行できます。もちろん、これは完全ではありません。たとえば、cachedThreadPoolエグゼキュータは、タスクごとに新しいスレッドを開始しない可能性がありますが、ポイントカットをオンRunnable.runCallable.callはなくに登録する場合は、それでThread.start十分な場合があります。

于 2012-09-19T08:59:24.693 に答える
1

おそらく、ThreadGroupが必要です。すべてのスレッドはThreadGroupのメンバーであり、新しいスレッドを開始すると、デフォルトでその親と同じグループに追加されます。

理論的には、スレッドがグループに追加またはグループから削除されたときに通知されるようにサブクラス化することは可能です(ただし推奨されません)。

このグループのスレッドをポーリングするか、すべてのスレッドをポーリングする方が良い解決策である可能性があります。

于 2012-09-19T09:09:50.963 に答える