Javaでスレッド作成リスナーを書くことは可能ですか?たとえば、aopを使用しますか?!
つまり、アプリケーションがスレッドを作成する場合、このオブジェクトを自分のテーブルやコンテナなどに登録したいということです。
Javaでスレッド作成リスナーを書くことは可能ですか?たとえば、aopを使用しますか?!
つまり、アプリケーションがスレッドを作成する場合、このオブジェクトを自分のテーブルやコンテナなどに登録したいということです。
JVMで実行中のすべてのスレッドを継続的にリストするスレッドを作成します。
その後、新しいスレッドが出現したことに気付くたびに、コード内のクラスにいずれかの方法で通知します。
次に、JVMで現在実行されているすべてのスレッドを一覧表示する方法に関するリンクをいくつか示します。
============
開始コード:
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 !
}
}
これはAOP(たとえばaspectj)で可能だと思います。ただし、アスペクトコンパイラを使用してJDKクラスを再コンパイルできない限り、独自の型Thread
およびThreadGroup
/型を作成する必要があります。スレッドの起動時に登録する場合はスレッドのメソッドに、スレッドオブジェクトの作成に登録する場合はプールExecutor
のポイントカットを定義します。start
createThread
以下は、アスペクトコンパイラを使用してJDKを再コンパイルした場合にのみ機能します。すべてのスレッドはで開始されるThread.start
ため、そのメソッドのポイントカットを記述してから、アドバイスを使用してやりたいことを実行できます。もちろん、これは完全ではありません。たとえば、cachedThreadPoolエグゼキュータは、タスクごとに新しいスレッドを開始しない可能性がありますが、ポイントカットをオンRunnable.run
でCallable.call
はなくに登録する場合は、それでThread.start
十分な場合があります。
おそらく、ThreadGroupが必要です。すべてのスレッドはThreadGroupのメンバーであり、新しいスレッドを開始すると、デフォルトでその親と同じグループに追加されます。
理論的には、スレッドがグループに追加またはグループから削除されたときに通知されるようにサブクラス化することは可能です(ただし推奨されません)。
このグループのスレッドをポーリングするか、すべてのスレッドをポーリングする方が良い解決策である可能性があります。