2012-09-19 18 views
6

¿Es posible escribir un oyente de creación de subprocesos en java? Por ejemplo, usando aop ?!Oyente de creación de subprocesos

Quiero decir algo así como que si mi aplicación crea un hilo me gustaría registrar este objeto en mi propia tabla, contenedor o algo así.

+1

Si registra un 'ClassLoader' en el hilo principal, es de esperar que sea heredado por todos los hilos nuevos, y con suerte, cualquier hilo tendrá que cargar alguna clase, lo que significa que su' ClassLoader' será consultado y tendrá una oportunidad para registrar el hilo .... – Saintali

+0

Iría por el camino de extender 'Thread' con los métodos requeridos para los oyentes. Por supuesto, funcionará solo para tu código. – SJuan76

+0

Necesita hacer un seguimiento de la transición (como: "En este momento se ha creado un nuevo subproceso y tengo que reaccionar de inmediato") o es suficiente tener una lista o algo de subprocesos creados en/por su aplicación en puntos específicos en el tiempo (como: "Ahora quiero saber los hilos y hacer algo con ellos"). – Fildor

Respuesta

1

creo que esto sería posible con AOP (aspectj por ejemplo). Pero aún se requiere crear sus propios tipos Thread y ThreadGroup/Executor, a menos que pueda recompilar las clases JDK con el compilador de aspecto. Defina el punto de corte en el método start de su subproceso si desea registrarse en el inicio de subproceso o en el createThread de su grupo si desea registrarse en la creación de los objetos de subproceso.


Las siguientes obras sólo si se vuelve a compilar el JDK con el compilador aspecto: Todas las roscas se inician con Thread.start, por lo que escribir un punto de corte para ese método, puede utilizar consejos para hacer lo que desea. Por supuesto, esto no es perfecto, ya que p. un ejecutor cacheado de ThreadPool puede no iniciar un nuevo hilo para cada tarea, pero tal vez si registra un punto en Runnable.run y Callable.call en lugar de Thread.start, eso podría ser suficiente.

+0

Esto podría funcionar para ejecutar subprocesos pero, la pregunta es sobre escuchar en subprocesos creados no en subprocesos en ejecución. – user454322

+0

@ user454322 No. A antes de recibir un aviso cuando se inician los hilos. (es decir, cualquiera de estos 3 métodos se llaman) – zeller

+0

Entiendo que se llamará antes de que los hilos _estren iniciados_, pero se llamarán cuando se creen hilos _? , por ejemplo, ¿qué pasaría si un hilo es _created_ pero nunca _started_? – user454322

4

Crearía un hilo que enumera continuamente todos los hilos en ejecución en la JVM.
Luego, cada vez que notifique que ha aparecido un nuevo hilo, notificará de alguna forma una clase en su código.

Éstos son algunos enlaces sobre cómo enumerar todos los temas actualmente se ejecuta en la JVM:

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

  2. Listing All Running Threads

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

Un código de inicio:

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

Estos ejemplos son buenos y útiles, pero no hay oyentes comportamiento. Me gustaría tener la información de que el nuevo hilo va a ser creado por jvm digamos 'instantáneamente' sin anular nada. –

+0

@ ŁukaszRzeszotarski puedes implementar un comportamiento de escucha a partir de los ejemplos anteriores, sin embargo, se trata de ejecutar hilos que no fueron creados (como preguntaste). – user454322

1

Tal vez un ThreadGroup es lo que necesita. Todos los subprocesos son miembros de un grupo de subprocesos y, cuando inicia un subproceso nuevo, se agrega al mismo grupo que su elemento primario de forma predeterminada.

En teoría, es posible (pero no se recomienda) que se notifique a la subclase cuando se agrega o elimina un subproceso del grupo.

Es probable que el sondeo de los hilos de estos grupos o el sondeo de todos los hilos sea una mejor solución.

+0

¿Se ha agregado un subproceso al grupo de subprocesos en la creación o cuando se inicia? –

+0

Desde el código, sugiere cuando se inicia. Si desea saber cuándo se crea un subproceso, debe subproducir subproceso (y cambiar todo el código de creación de subproceso) –

Cuestiones relacionadas