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...
    }
}

主.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)实现。但是仍然需要创建自己的Threadand ThreadGroup/Executor类型,除非您可以使用切面编译器重新编译 JDK 类。start如果要在线程启动时注册,请在线程方法上定义切入点;createThread如果要在创建线程对象时注册,请在池的方法上定义切入点。


仅当您使用方面编译器重新编译 JDK 时,以下内容才有效:所有线程都以 开头Thread.start,因此为该方法编写一个切入点,然后您可以使用建议来做您想做的事情。当然,这并不完美,因为例如 cachedThreadPool 执行器可能不会为每个任务启动一个新线程,但也许如果您在Runnable.runandCallable.call而不是 on 上注册一个切入点Thread.start,这可能就足够了。

于 2012-09-19T08:59:24.693 回答
1

也许你需要一个 ThreadGroup。所有线程都是 ThreadGroup 的成员,当您启动新线程时,默认情况下会将其添加到与其父级相同的组中。

理论上,当从组中添加或删除线程时,它可能(但不推荐)子类得到通知。

轮询该组的线程或轮询所有线程可能是更好的解决方案。

于 2012-09-19T09:09:50.963 回答