Comunicação Interthread

Se você está ciente da comunicação entre processos, será fácil para você entender a comunicação entre processos. A comunicação entre threads é importante quando você desenvolve um aplicativo em que dois ou mais threads trocam algumas informações.

Existem três métodos simples e um pequeno truque que torna possível a comunicação de threads. Todos os três métodos estão listados abaixo -

Sr. Não. Método e Descrição
1

public void wait()

Faz com que a thread atual espere até que outra thread invoque o notificar ().

2

public void notify()

Desperta um único thread que está aguardando no monitor deste objeto.

3

public void notifyAll()

Desperta todos os threads que chamaram wait () no mesmo objeto.

Esses métodos foram implementados como finalmétodos em Object, portanto, estão disponíveis em todas as classes. Todos os três métodos podem ser chamados apenas de dentro de umsynchronized contexto.

Exemplo

Este exemplo mostra como dois threads podem se comunicar usando wait() e notify()método. Você pode criar um sistema complexo usando o mesmo conceito.

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);
   }
}

Quando o programa acima é cumprido e executado, ele produz o seguinte resultado -

Resultado

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

O exemplo acima foi obtido e modificado em [https://stackoverflow.com/questions/2170520/inter-thread-communication-in-java]