Java no suspended threads

Suspending, resuming, and stopping threads in Java

Java’s threads allow for concurrent processing of multiple requests. Java includes functionality to pause, resume, and terminate running threads. Using these functions, you can manage thread execution and guarantee that it proceeds normally.

So, in this post, I’ll go over how to suspend, resume, and terminate threads in the Java programming language. However, if you are unfamiliar with multithreading in Java, it is recommended that you learn it first and then proceed to understand how thread suspending, resuming, and stopping work.

Suspending Threads in Java

In Java, a thread can be suspended by using the wait() method on an object. This method suspends thread execution until it is notified by another thread using the notify() method. As an example:

Object lock = new Object(); Thread myThread = new Thread(() -> < synchronized(lock) < try < lock.wait(); >catch (InterruptedException e) < e.printStackTrace(); >> >); myThread.start(); // start thread synchronized(lock) < lock.notify(); // resume thread >

Resuming Threads in Java

An interrupted thread’s execution can be picked back up by notifying the waiting thread using the notify() method. As an example:

Object lock = new Object(); Thread myThread = new Thread(() -> < synchronized(lock) < try < lock.wait(); >catch (InterruptedException e) < e.printStackTrace(); >> >); myThread.start(); // start thread myThread.interrupt(); // interrupt thread synchronized(lock) < lock.notify(); // resume thread >

Stopping Threads in Java

To halt a running thread, use a boolean flag to signal the thread to stop gracefully. Consider the following code fragment as an example:

class MyThread extends Thread < private volatile boolean running = true; public void stopThread() < running = false; >public void run() < while(running) < // do some work > > > MyThread myThread = new MyThread(); myThread.start(); // start thread myThread.stopThread(); // stop thread

Suspending Resuming, and Stopping Threads Example Program in Java

Consider the following program as an example demonstrating the suspending, resuming, and stopping of threads in the Java programming language:

class MyThread implements Runnable < Thread td; volatile boolean suspended; volatile boolean stopped; MyThread(String name) < td = new Thread(this, name); suspended = false; stopped = false; td.start(); >public void run() < System.out.println(td.getName() + " starting."); try < for (int i = 1; i < 1000 && !stopped; i++) < System.out.print(i + " "); if (i % 10 == 0) < System.out.println(); Thread.sleep(250); >synchronized (this) < while (suspended) < wait(); >> > > catch (InterruptedException e) < System.out.println(td.getName() + " interrupted."); >System.out.println(td.getName() + " exiting."); > synchronized void stop() < stopped = true; suspended = false; notify(); >synchronized void suspendThread() < suspended = true; >synchronized void resumeThread() < suspended = false; notify(); >> public class ThreadExample < public static void main(String args[]) throws InterruptedException < MyThread thread1 = new MyThread("Thread 1"); MyThread thread2 = new MyThread("Thread 2"); Thread.sleep(1000); thread1.suspendThread(); System.out.println("\nSuspending " + thread1.td.getName()); Thread.sleep(1000); thread1.resumeThread(); System.out.println("\nResuming " + thread1.td.getName()); Thread.sleep(1000); thread2.suspendThread(); System.out.println("\nSuspending " + thread2.td.getName()); Thread.sleep(1000); thread2.resumeThread(); System.out.println("\nResuming " + thread2.td.getName()); Thread.sleep(1000); thread1.stop(); System.out.println("\nStopping " + thread1.td.getName()); Thread.sleep(1000); thread2.stop(); System.out.println("\nStopping " + thread2.td.getName()); >>
Thread 1 starting. Thread 2 starting. 1 2 3 4 1 2 3 5 6 7 8 9 10 4 5 6 7 8 9 10 11 11 12 13 14 15 16 17 18 19 20 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 31 32 33 34 35 36 37 38 39 40 Suspending Thread 1 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 41 42 43 44 45 46 47 48 49 50 Resuming Thread 1 81 82 83 84 85 86 87 88 89 90 51 52 53 54 55 56 57 58 59 60 91 92 93 94 95 96 97 98 99 100 61 62 63 64 65 66 67 68 69 70 101 102 103 104 105 106 107 108 109 110 71 72 73 74 75 76 77 78 79 80 111 112 113 114 115 116 117 118 119 120 Suspending Thread 2 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 Resuming Thread 2 127 128 129 130 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 151 152 153 154 155 156 157 158 159 160 Stopping Thread 1 161 162 163 164 165 166 167 168 169 170 Thread 1 exiting. 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 Stopping Thread 2 Thread 2 exiting.

This program creates a class called MyThread that adheres to the interface known as Runnable. There are three ways to stop, suspend, and resume a thread in the MyThread class.

Читайте также:  Save editor html games

The MyThread class’s run method defines the thread’s behavior, which is to print numbers from 1 to 999 with a delay of 250 milliseconds after every ten numbers, until the stopped flag becomes true. If the suspended flag is set, the thread waits by invoking the object’s wait method.

The ThreadExample class instantiates two instances of the MyThread class and calls the suspendThread, resumeThread, and stop methods on them after a second interval. The suspendThread method sets the suspended flag to true, causing the thread to be suspended by calling wait on the object. To wake up the waiting thread, the resumeThread method sets the suspended flag to false and calls notify on the object. The stopped flag is set to true by the stop method, which terminates the thread.

Liked this article? Share it!

Источник

36.4. Java – Управление потоками

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

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

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

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

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

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

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

Оглавление

  • 1. Java – Самоучитель для начинающих
  • 2. Java – Обзор языка
  • 3. Java – Установка и настройка
  • 4. Java – Синтаксис
  • 5. Java – Классы и объекты
  • 6. Java – Конструкторы
  • 7. Java – Типы данных и литералы
  • 8. Java – Типы переменных
  • 9. Java – Модификаторы
  • 10. Java – Операторы
  • 11. Java – Циклы и операторы цикла
  • 11.1. Java – Цикл while
  • 11.2. Java – Цикл for
  • 11.3. Java – Улучшенный цикл for
  • 11.4. Java – Цикл do..while
  • 11.5. Java – Оператор break
  • 11.6. Java – Оператор continue
  • 12. Java – Операторы принятия решений
  • 12.1. Java – Оператор if
  • 12.2. Java – Оператор if..else
  • 12.3. Java – Вложенный оператор if
  • 12.4. Java – Оператор switch..case
  • 12.5. Java – Условный оператор (? 🙂
  • 13. Java – Числа
  • 13.1. Java – Методы byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
  • 13.2. Java – Метод compareTo()
  • 13.3. Java – Метод equals()
  • 13.4. Java – Метод valueOf()
  • 13.5. Java – Метод toString()
  • 13.6. Java – Метод parseInt()
  • 13.7. Java – Метод Math.abs()
  • 13.8. Java – Метод Math.ceil()
  • 13.9. Java – Метод Math.floor()
  • 13.10. Java – Метод Math.rint()
  • 13.11. Java – Метод Math.round()
  • 13.12. Java – Метод Math.min()
  • 13.13. Java – Метод Math.max()
  • 13.14. Java – Метод Math.exp()
  • 13.15. Java – Метод Math.log()
  • 13.16. Java – Метод Math.pow()
  • 13.17. Java – Метод Math.sqrt()
  • 13.18. Java – Метод Math.sin()
  • 13.19. Java – Метод Math.cos()
  • 13.20. Java – Метод Math.tan()
  • 13.21. Java – Метод Math.asin()
  • 13.22. Java – Метод Math.acos()
  • 13.23. Java – Метод Math.atan()
  • 13.24. Java – Метод Math.atan2()
  • 13.25. Java – Метод Math.toDegrees()
  • 13.26. Java – Метод Math.toRadians()
  • 13.27. Java – Метод Math.random()
  • 14. Java – Символы
  • 14.1. Java – Метод Character.isLetter()
  • 14.2. Java – Метод Character.isDigit()
  • 14.3. Java – Метод Character.isWhitespace()
  • 14.4. Java – Метод Character.isUpperCase()
  • 14.5. Java – Метод Character.isLowerCase()
  • 14.6. Java – Метод Character.toUpperCase()
  • 14.7. Java – Метод Character.toLowerCase()
  • 14.8. Java – Метод Character.toString()
  • 15. Java – Строки
  • 15.1. Java – Метод charAt()
  • 15.2. Java – Метод compareTo()
  • 15.3. Java – Метод compareToIgnoreCase()
  • 15.4. Java – Метод concat()
  • 15.5. Java – Метод contentEquals()
  • 15.6. Java – Метод copyValueOf()
  • 15.7. Java – Метод endsWith()
  • 15.8. Java – Метод equals()
  • 15.9. Java – Метод equalsIgnoreCase()
  • 15.10. Java – Метод getBytes()
  • 15.11. Java – Метод getChars()
  • 15.12. Java – Метод hashCode()
  • 15.13. Java – Метод indexOf()
  • 15.14. Java – Метод intern()
  • 15.15. Java – Метод lastIndexOf()
  • 15.16. Java – Метод length()
  • 15.17. Java – Метод matches()
  • 15.18. Java – Метод regionMatches()
  • 15.19. Java – Метод replace()
  • 15.20. Java – Метод replaceAll()
  • 15.21. Java – Метод replaceFirst()
  • 15.22. Java – Метод split()
  • 15.23. Java – Метод startsWith()
  • 15.24. Java – Метод subSequence()
  • 15.25. Java – Метод substring()
  • 15.26. Java – Метод toCharArray()
  • 15.27. Java – Метод toLowerCase()
  • 15.28. Java – Метод toString()
  • 15.29. Java – Метод toUpperCase()
  • 15.30. Java – Метод trim()
  • 15.31. Java – Метод valueOf()
  • 15.32. Java – Классы StringBuilder и StringBuffer
  • 15.32.1. Java – Метод append()
  • 15.32.2. Java – Метод reverse()
  • 15.32.3. Java – Метод delete()
  • 15.32.4. Java – Метод insert()
  • 15.32.5. Java – Метод replace()
  • 16. Java – Массивы
  • 17. Java – Дата и время
  • 18. Java – Регулярные выражения
  • 19. Java – Методы
  • 20. Java – Потоки ввода/вывода, файлы и каталоги
  • 20.1. Java – Класс ByteArrayInputStream
  • 20.2. Java – Класс DataInputStream
  • 20.3. Java – Класс ByteArrayOutputStream
  • 20.4. Java – Класс DataOutputStream
  • 20.5. Java – Класс File
  • 20.6. Java – Класс FileReader
  • 20.7. Java – Класс FileWriter
  • 21. Java – Исключения
  • 21.1. Java – Встроенные исключения
  • 22. Java – Вложенные и внутренние классы
  • 23. Java – Наследование
  • 24. Java – Переопределение
  • 25. Java – Полиморфизм
  • 26. Java – Абстракция
  • 27. Java – Инкапсуляция
  • 28. Java – Интерфейсы
  • 29. Java – Пакеты
  • 30. Java – Структуры данных
  • 30.1. Java – Интерфейс Enumeration
  • 30.2. Java – Класс BitSet
  • 30.3. Java – Класс Vector
  • 30.4. Java – Класс Stack
  • 30.5. Java – Класс Dictionary
  • 30.6. Java – Класс Hashtable
  • 30.7. Java – Класс Properties
  • 31. Java – Коллекции
  • 31.1. Java – Интерфейс Collection
  • 31.2. Java – Интерфейс List
  • 31.3. Java – Интерфейс Set
  • 31.4. Java – Интерфейс SortedSet
  • 31.5. Java – Интерфейс Map
  • 31.6. Java – Интерфейс Map.Entry
  • 31.7. Java – Интерфейс SortedMap
  • 31.8. Java – Класс LinkedList
  • 31.9. Java – Класс ArrayList
  • 31.10. Java – Класс HashSet
  • 31.11. Java – Класс LinkedHashSet
  • 31.12. Java – Класс TreeSet
  • 31.13. Java – Класс HashMap
  • 31.14. Java – Класс TreeMap
  • 31.15. Java – Класс WeakHashMap
  • 31.16. Java – Класс LinkedHashMap
  • 31.17. Java – Класс IdentityHashMap
  • 31.18. Java – Алгоритмы Collection
  • 31.19. Java – Iterator и ListIterator
  • 31.20. Java – Comparator
  • 32. Java – Дженерики
  • 33. Java – Сериализация
  • 34. Java – Сеть
  • 34.1. Java – Обработка URL
  • 35. Java – Отправка Email
  • 36. Java – Многопоточность
  • 36.1. Java – Синхронизация потоков
  • 36.2. Java – Межпоточная связь
  • 36.3. Java – Взаимная блокировка потоков
  • 36.4. Java – Управление потоками
  • 37. Java – Основы работы с апплетами
  • 38. Java – Javadoc

Источник

Оцените статью