2011-08-02 24 views
20

Tengo un hilo, A que tiene una lista. La lista contiene algunos objetos. Ahora quiero diseñar un mecanismo por el cual pueda enviar un mensaje al hilo A.Comunicación entre dos hilos

Thread A se ejecuta en un bucle (no espera ni duerme). Algún otro hilo, B, envía un mensaje al hilo A y el hilo A vacía todas sus colas.

¿Cómo puedo enviar mensajes entre hilos?

class A extends Thread { 
    List<Object> objs = something; //Init it 
    void run() { 
     while(true) { 
      //Body which works on objects. 
      //After receiving an external message, "A" should perform some action, for example, empty objects. 
     } 
    } 
} 

EDIT: ¿Puedo hacerlo de esta manera?

class A extends Thread { 
    List<Object> objs = something; //Init it 
    Boolean flag = false; 

    public void setFlag(boolean value) { 
     synchronized(flag) { 
      this.flag = value; 
     } 
    } 

    public void getFlag() { 
     synchronized(flag) { 
      return this.flag; 
     } 
    } 

    void run() { 
     while(true) { 
      //Body which works on objects. 
      //After receiving an external message, A should perform some action, for example, empty objects. 
      if (getFlag == true) 
       //Empty list 
     } 
    } 
} 
+3

En Java que por lo general no envían mensajes entre procesos, pero se utilizan objetos sincronizados para pasar valores entre los hilos. – toto2

+0

He sincronizado las variables de instancia según lo methoied en mi nueva edición, ¿funcionará? – akshay

+1

@akshay Editas se ve bien (excepto que quisiste decir 'if (getFlag() == verdadero)'). – toto2

Respuesta

32

Usted podría tener un BlockingQueue de objetos de los mensajes. Otros hilos colocarían mensajes en la cola. Como parte del bucle while(true), el hilo A sería poll la cola y procesará los mensajes que hayan llegado.

En código:

class A extends Thread{ 
List<Object> objs = something ;//init it 
BlockingQueue<Message> queue = new LinkedBlockingQueue<Message>(); 
void run(){ 
    while(true){ 
     Message msg; 
     while ((msg = queue.poll()) != null) { 
     // process msg 
     } 
     // do other stuff 
    } 
    } 
} 

Otros temas ahora pueden llamar queue.put() para enviar mensajes al hilo A.

+0

queue es una variable de instancia del subproceso A. Ahora, si el subproceso B agregará algunos valores en el momento en que el subproceso A lo está recuperando. ¿No será un problema? – akshay

+1

@akshay: (1) 'queue' no tiene que ser miembro de' A' (lo hice tan simplemente como una ilustración); (2) 'BlockingQueue' es seguro para subprocesos, por lo que de cualquier forma no habrá ningún problema. – NPE

+0

: ¿Mi nueva edición resolverá el problema ?????????? – akshay

0

En un caso simplista, puede agregar alguna variable de instancia a la clase de subproceso A y hacer que el subproceso B establezca su valor para indicar que el subproceso A debe borrar sus 'colas. En un caso más avanzado, puede usar una cola de mensajes a la que pueden acceder ambos subprocesos A y B. B colocaría un mensaje allí y A leería y actuaría en consecuencia.

En todos los casos, el acceso a la variable o la cola debe protegerse adecuadamente para el acceso a múltiples hilos.

0

Debería poder agregar un método a la clase "A" que se puede llamar en cualquier otro lugar de su código. Simplemente mantenga la referencia a su instancia de clase "A" en un lugar accesible.

class A extends Thread{ 
List<Object> objs = something ;//init it 
void run(){ 
    while(true){ 
     //body which works on objs 
     //open receiving external message A should perform some action ie empty objs 
    } 
    } 
    void ChangeState() 
    { 
    //clear objs 
    } 
} 
+0

Causa problema. Como mi bucle for usa fuertemente objs, si se borra repentinamente causará el problema – akshay

+0

Su pregunta tiene que ver con cómo se envía un mensaje al hilo A para que pueda realizar una acción deseada. Mi respuesta fue dirigida directamente a eso. No entró en la seguridad de subprocesos, ya que supongo que estarías haciendo los controles apropiados (sincronización) en tu código antes de borrar o leer cualquier cosa. – Garvin

Cuestiones relacionadas