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.5. Java — Управление потоками

    Core Java обеспечивает полный контроль над многопоточной программой. Вы можете разработать многопоточную программу, которую можно приостановить, возобновить или полностью остановить в зависимости от ваших требований. Существуют различные статические методы, которые вы можете использовать для объектов потока для управления их поведением. В следующей таблице перечислены эти методы:

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

    1

    public void suspend()
    Этот метод переводит поток в приостановленное состояние, он может быть возобновлен с помощью метода resume().

    2

    public void stop()
    Этот метод полностью останавливает поток.

    3

    public void resume()
    Этот метод возобновляет поток, который был приостановлен с помощью метода suspend().

    4

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

    5

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

    Имейте в виду, что в последних версиях Java не рекомендуется использовать методы suspend(), resume() и stop(), поэтому вам следует использовать доступные альтернативы.

    Пример

    class RunnableDemo implements Runnable {
       public Thread t;
       private String threadName;
       boolean suspended = false;
    
       RunnableDemo( String name) {
          threadName = name;
          System.out.println("Создание " +  threadName );
       }
       
       public void run() {
          System.out.println("Выолнение " +  threadName );
          try {
             for(int i = 10; i > 0; i--) {
                System.out.println("Поток: " + threadName + ", " + i);
                // Пусть поток немного подождет.
                Thread.sleep(300);
                synchronized(this) {
                   while(suspended) {
                      wait();
                   }
                }
             }
          } catch (InterruptedException e) {
             System.out.println("Поток " +  threadName + " прерван.");
          }
          System.out.println("Поток " +  threadName + " завершается.");
       }
    
       public void start () {
          System.out.println("Запуск " +  threadName );
          if (t == null) {
             t = new Thread (this, threadName);
             t.start ();
          }
       }
       
       void suspend() {
          suspended = true;
       }
       
       synchronized void resume() {
          suspended = false;
          notify();
       }
    }
    
    public class TestThread {
    
       public static void main(String args[]) {
    
          RunnableDemo R1 = new RunnableDemo( "Поток-1");
          R1.start();
    
          RunnableDemo R2 = new RunnableDemo( " Поток-2");
          R2.start();
    
          try {
             Thread.sleep(1000);
             R1.suspend();
             System.out.println("Приостановка первого потока");
             Thread.sleep(1000);
             R1.resume();
             System.out.println("Возобновление первого потока");
             
             R2.suspend();
             System.out.println("Приостановка второго потока");
             Thread.sleep(1000);
             R2.resume();
             System.out.println("Возобновление второго потока");
          } catch (InterruptedException e) {
             System.out.println("Основной поток прерван");
          }try {
             System.out.println("Ожидание завершения потоков.");
             R1.t.join();
             R2.t.join();
          } catch (InterruptedException e) {
             System.out.println("Основной поток прерван");
          }
          System.out.println("Основной поток завершается.");
       }
    }
    

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

    Создание Поток-1
    Запуск Поток-1
    Создание Поток-2
    Запуск Поток-2
    Выполнение Поток-1
    Поток: Поток-1, 10
    Запуск Поток-2
    Поток: Поток-2, 10
    Поток: Поток-1, 9
    Поток: Поток-2, 9
    Поток: Поток-1, 8
    Поток: Поток-2, 8
    Поток: Поток-1, 7
    Поток: Поток-2, 7
    Приостановка первого потока
    Поток: Поток-2, 6
    Поток: Поток-2, 5
    Поток: Поток-2, 4
    Возобновление первого потока
    Приостановка второго потока 
    Поток: Поток-1, 6
    Поток: Поток-1, 5
    Поток: Поток-1, 4
    Поток: Поток-1, 3
    Возобновление второго потока 
    Поток: Поток-2, 3
    Ожидание завершения потоков.
    Поток: Поток-1, 2
    Поток: Поток -2, 2
    Поток: Поток -1, 1
    Поток: Поток -2, 1
    Поток Поток-1 завершается.
    Поток Поток-2 завершается.
    Основной поток завершается.
    
    Поделитесь:

    О сайте

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

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


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