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 завершается.
Основной поток завершается.

Оглавление