2012-09-19 65 views
6

是否有可能在java中编写线程创建监听器?例如使用aop ?!线程创建监听器

我的意思是这样的,如果我的应用程序创建一个线程,我想注册这个对象在我自己的表,容器或其他东西。

+1

如果你在主线程中注册了一个'ClassLoader',希望这将会被所有新线程继承,并且希望任何线程都需要加载一些类,这意味着你的'ClassLoader'将会被查询,并且你有一个机会来注册线程.... – Saintali

+0

我会通过扩展'线程'的方式为听众所需的方法。当然,只能用于你的代码。 – SJuan76

+0

您是否需要跟踪转换(例如:“现在创建了一个新的线程,我必须立即对它做出反应”),还是足以让您的应用程序创建一个或多个线程列表特定的时间点(比如:“现在我想知道线程并对它们做些什么。”)? – Fildor

回答

1

我认为这将有可能与AOP(AspectJ的举例)。但是仍然需要创建自己的ThreadThreadGroup/Executor类型,除非可以使用方面编译器重新编译JDK类。如果要注册线程启动或池的createThread(如果要注册创建线程对象),请在线程的start方法上定义切入点。


只有当你重新编译JDK与编译器方面的以下工作: 所有线程都开始Thread.start,所以写了这个方法,那么你可以使用建议做你想要什么的切入点。当然这并不完美,因为例如一个cachedThreadPool执行器可能不会为每个任务启动一个新线程,但是如果你在Runnable.runCallable.call而不是Thread.start上注册一个切入点,那可能就足够了。

+0

这可能适用于运行线程,但问题是关于创建线程而不是线程正在运行的线程。 – user454322

+0

@ user454322编号A在线程启动时,建议将被调用。 (即这三种方法中的任何一种被调用) – zeller

+0

我知道它将在线程_are started_之前被调用,但会在线程_re created_时被调用? 例如,如果线程是_created_但从未_started_会发生什么? – user454322

4

我会创建一个线程,不断列出JVM上所有正在运行的线程。
然后,每次它不确定一个新线程出现时,它会以任何方式通知您的代码中的一个类。

下面是关于如何列出所有线程当前运行在JVM上的一些链接:

  1. Get a List of all Threads currently running in Java

  2. Listing All Running Threads

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

A起始码:

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 ! 
    } 
} 
+0

这些例子是好的和有用的,但没有听众行为。我想要得到jvm创建新线程的信息,让我们在不重写任何内容的情况下“不定式”地说。 –

+0

@ŁukaszRzeszotarski你可以从上面的例子中实现一个监听器行为,但它们是关于运行线程而不是创建线程的(如你所问)。 – user454322

1

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

从理论上讲,当线程被添加或从组中移除时,可能(但不推荐)子类将被通知。

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

+0

线程在创建时或线程启动时被添加到线程组中? –

+0

从代码中可以看出它何时启动。如果你想知道什么时候创建一个线程,你需要子类Thread(并且改变所有创建线程的代码) –