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