Java — Самоучитель

  • 15. Java — Массивы
  • 16. Java — Дата и время
  • 17. Java — Регулярные выражения
  • 18. Java — Методы
  • 21. Java — Вложенные и внутренние классы
  • 22. Java — Наследование
  • 23. Java — Переопределение
  • 24. Java — Полиморфизм
  • 25. Java — Абстракция
  • 26. Java — Инкапсуляция
  • 27. Java — Интерфейсы
  • 28. Java — Пакеты
  • 31. Java — Дженерики
  • 32. Java — Сериализация
  • 34. Java — Отправка Email
  • 36. Java — Основы работы с апплетами
  • 37. Java — Javadoc
  • 35.3. Java — Межпоточная связь

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

    Содержание

    [скрыть]

    Есть три простых метода, а также маленькая хитрость, позволяющие установить связь между потоками. Все три метода перечислены ниже:

    Метод и описание

    1

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

    2

    public void notify()
    Пробуждает единственный поток, ожидающий на мониторе этого объекта.

    3

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

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

    Пример

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

    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 = { "Привет", "Как ты ?", "Я тоже хорошо!" };
    
       public T1(Chat m1) {
          this.m = m1;
          new Thread(this, "Вопрос").start();
       }
    
       public void run() {
          for (int i = 0; i < s1.length; i++) {
             m.Question(s1[i]);
          }
       }
    }
    
    class T2 implements Runnable {
       Chat m;
       String[] s2 = { "Привет", " Я хорошо, как ты?", "Отлично!" };
    
       public T2(Chat m2) {
          this.m = m2;
          new Thread(this, "Ответ").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);
       }
    }
    

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

    Привет
    Привет
    Как дела?
    Хорошо, а у тебя?
    Тоже хорошо!
    Отлично!
    
    Поделитесь:

    О сайте

    Все материалы сайта proglang.su являются результатом труда его авторов. Копирование материалов в некоммерческих целях без указания источника в виде прямой ссылки на сайт proglang.su запрещено. Использование материалов в коммерческих целях разрешено только с письменного согласия автора. Нарушение авторских прав преследуется по закону. Мы это делаем, чтобы защитить плоды своих трудов от воровства. © 2014-2019

    Присоединяйтесь


    Обратная связь