2012-06-19 20 views
7

En Java tengo la necesidad de implementar una clase que extienda el subproceso dentro de otra clase similar. ¿Es eso posible?¿Puedo ejecutar un hilo dentro de un hilo en java?

Un ejemplo de lo que estoy tratando de hacer es la siguiente (simplificado) fragmento:

// The first layer is a Thread 
public class Consumer extends Thread { 

    // Variables initialized correctly in the Creator 
    private BufferManager BProducer = null; 

    static class Mutex extends Object {} 
    static private Mutex sharedMutex = null; 


    public Consumer() { 
     // Initialization of the thread 
     sharedMutex = new Mutex(); 

     BProducer = new BProducer(sharedMutex); 
     BProducer.start(); 
    } 


    public void run() { 

     int data = BProducer.getData(); 

     ///// .... other operations 
    } 


    ////// ...... some code 

    // Also the second layer is a Thread 
    private class BufferManager extends Thread { 

     Mutex sharedMutex; 
     int data; 

     public BufferManager(Mutex sM) { 
      sharedMutex = sM; 
     } 

     public int getData(Mutex sM) { 
      int tempdata; 
      synchronized(sharedMutex) { 
       tempdata = data; 
      } 
      return tempdata; 
     } 

     public void run() { 
      synchronized(sharedMutex) { 
       data = getDataFromSource(); 
      } 
      ///// .... other operations on the data 
     } 
    } 
} 

El segundo hilo se lleva a cabo directamente en el interior de la primera. Además, me gustaría saber si la implementación de un Mutex así funcionará. Si no, ¿hay alguna forma mejor (estándar) de hacerlo?

Gracias de antemano.

+8

Esto no es Inception. – mre

+3

.. ¿Cómo puede estar seguro? – BlackVegetable

+1

Todos los hilos son iniciados por otros hilos, no tiene otra opción. Los hilos son para hacer el trabajo lo más independientemente posible. –

Respuesta

18

El Thread no se ejecuta "dentro", sino que está situado uno al lado del otro.

Así que sí, puede iniciar otra Thread para ejecutar de lado a lado con las otras dos Thread 's. Como cuestión de hecho, cualquier Thread puede iniciar otro Thread (siempre que el sistema operativo lo permita).

+0

Gracias @ nicholas.hauschild. Por lo tanto, el hecho de que esté escrito dentro no cambia el comportamiento del subproceso. ¿Es el Mutex compartido según usted? ¿Bloqueará al consumidor si el BufferManager lo bloqueó? – 2dvisio

+0

Bueno, no estoy seguro de que el código que ha proporcionado compile ('nuevo BProducer (sharedMutex)'?) Pero creo que su 'Mutex' permitirá que su' Producer' y 'Consumer' se bloqueen correctamente. –

+0

Consulte mi respuesta para más detalles, pero sugiero que las declaraciones de las variables Mutex sean definitivas. – user949300

5

Sí, esto debería funcionar y el Mutex compartido debería hacer su trabajo. Fuera de la paranoia, haría ambas declaraciones mutex final para evitar problemas extraños de "escape". p.ej.

final Mutex sharedMutex; 

Una sugerencia: tal vez este es mi estilo, pero para un código como éste rara vez se extienden Thread. Simplemente implemente Runnable en su lugar. IMO es un poco menos confuso (YMMV aquí). Además, cuando comienzas a utilizar utilidades avanzadas de simultaneidad como Executor, se ocupan de Runnables, no de subprocesos.

+0

+1 Excelente punto sobre 'Runnables'. Sería difícil para las clases 'java.util.concurrent' permitir la agrupación' Thread' sin usar 'Runnable''s. –

+0

Acabo de ver tu respuesta. Al implementar Runnable, ¿significa que anidar los Runnables también podría funcionar? – 2dvisio