Comunicación entre hilos

Si conoce la comunicación entre procesos, le resultará fácil comprender la comunicación entre hilos. La comunicación entre subprocesos es importante cuando se desarrolla una aplicación en la que dos o más subprocesos intercambian información.

Hay tres métodos simples y un pequeño truco que hace posible la comunicación por hilo. Los tres métodos se enumeran a continuación:

No Señor. Método y descripción
1

public void wait()

Hace que el hilo actual espere hasta que otro hilo invoque el aviso ().

2

public void notify()

Despierta un único hilo que está esperando en el monitor de este objeto.

3

public void notifyAll()

Despierta todos los hilos que llamaron a wait () en el mismo objeto.

Estos métodos se han implementado como finalmétodos en Object, por lo que están disponibles en todas las clases. Los tres métodos solo se pueden llamar desde dentro de unsynchronized contexto.

Ejemplo

Este ejemplo muestra cómo dos hilos pueden comunicarse usando wait() y notify()método. Puede crear un sistema complejo utilizando el mismo concepto.

class Chat {
   boolean flag = false;

   public synchronized void Question(String msg) {

      if (flag) {
         
         try {
            wait();
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
      System.out.println(msg);
      flag = true;
      notify();
   }

   public synchronized void Answer(String msg) {

      if (!flag) {
         
         try {
            wait();
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
      System.out.println(msg);
      flag = false;
      notify();
   }
}

class T1 implements Runnable {
   Chat m;
   String[] s1 = { "Hi", "How are you ?", "I am also doing fine!" };

   public T1(Chat m1) {
      this.m = m1;
      new Thread(this, "Question").start();
   }

   public void run() {
   
      for (int i = 0; i < s1.length; i++) {
         m.Question(s1[i]);
      }
   }
}

class T2 implements Runnable {
   Chat m;
   String[] s2 = { "Hi", "I am good, what about you?", "Great!" };

   public T2(Chat m2) {
      this.m = m2;
      new Thread(this, "Answer").start();
   }

   public void run() {

      for (int i = 0; i < s2.length; i++) {
         m.Answer(s2[i]);
      }
   }
}

public class TestThread {

   public static void main(String[] args) {
      Chat m = new Chat();
      new T1(m);
      new T2(m);
   }
}

Cuando se cumple y ejecuta el programa anterior, produce el siguiente resultado:

Salida

Hi
Hi
How are you ?
I am good, what about you?
I am also doing fine!
Great!

El ejemplo anterior se tomó y luego se modificó de [https://stackoverflow.com/questions/2170520/inter-thread-communication-in-java]