Учебники

Межпотоковое общение

Если вы знаете о межпроцессном взаимодействии, вам будет легко понять межпроцессное взаимодействие. Межпотоковая коммуникация важна при разработке приложения, в котором два или более потоков обмениваются некоторой информацией.

Существует три простых метода и небольшая хитрость, которая делает возможным взаимодействие потоков. Все три метода перечислены ниже —

Sr.No. Метод и описание
1

public void wait ()

Заставляет текущий поток ждать, пока другой поток не вызовет notify ().

2

public void notify ()

Просыпается один поток, который ожидает на мониторе этого объекта.

3

public void notifyAll ()

Пробуждает все потоки, вызвавшие wait () для одного и того же объекта.

public void wait ()

Заставляет текущий поток ждать, пока другой поток не вызовет notify ().

public void notify ()

Просыпается один поток, который ожидает на мониторе этого объекта.

public void notifyAll ()

Пробуждает все потоки, вызвавшие wait () для одного и того же объекта.

Эти методы были реализованы как окончательные методы в Object, поэтому они доступны во всех классах. Все три метода могут быть вызваны только из синхронизированного контекста.

пример

В этом примере показано, как два потока могут общаться, используя методы wait () и notify () . Вы можете создать сложную систему, используя ту же концепцию.

Live Demo

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

Когда вышеуказанная программа выполняется и выполняется, она дает следующий результат —

Выход

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

Приведенный выше пример был взят и затем изменен с [https://stackoverflow.com/questions/2170520/inter-thread-communication-in-java]