Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

9.6.2.1. Связи меяеду потоками в Java

Функции wait(), notify() и notifyAll() позволяют не только синхронизи-

ровать параллельное выполнение потоков, но и организовать приостановку и

выполнение одного потока без применения запрещённых функций suspend()

и resume().

Функции wait(), notify() и notifyAll() являются членами класса Object, кото-

рый наследуется любым классом. То есть эти функции доступны в любом

объекте. В классе они определены как:

final vold wait() throws InterruptedException;

final vold notify();

final void notifyAII();

Эти функции должны вызываться в синхронизированном блоке с ключевым

словом synchronized. А функция wait() ещё должна быть заключена в блок

try-catch, поскольку возможен выброс исключения InterruptedException.

Функция wait() приостанавливает (блокирует) выполнение потока объ-

екта, в котором она вызывается, до тех пор, пока этот поток не будет разбло-

кирован вызовом функции notify() или notifyAll().

Вызов функции notify() возобновляет (разблокирует) в объекте выпол-

нение первого потока из потоков, приостановленных ранее функцией wait()

на этом объекте.

Вызов функции notifyAll() возобновляет (разблокирует) в объекте вы-

полнение всех потоков, приостановленных ранее функцией wait() на том же

объекте.

Пример 9.6.2.1.1 показывает, что функции wait() и notify() позволяют

приостановить и возобновить выполнение потока без применения запрещён-

ных функций suspend() и resume() класса Thread.

Пример 9.6.2.1.1. Приостановка и возобновление потока в Java

///////////////

// Java и J#

class User extends Thread

{

lnt num;

boolean waiting = false;

int n=0;

public User (lnt Num)

{num= Num;>

public void suspendUser ( ) // Приостановить поток

{

waiting= true;

>

synchronized public void resumeUser ( ) // Возобновить поток

{

waiting= false;

notify();

>

// Потоковая функция

public void run ( )

{

while (n < 5)

{

try

{

// Класс объектов с потоками

// Признак ожидания

// Порядковый номер цикла

Thread.sleep (10); // Поспать

synchronized (this)

{

If(waiting)

wait(); // Подождать

System.out.println ("num= "+ num+

» n= " + n++);

>

catch(InterruptedException e) { >

>

System.out.println ("Thread num=" + num+ " finished");

>

class SuspendResume // Класс с основным потоком

{

public static void main ( )

{

User usl= new User (1); // Создать первый объект с потоком

User us2= new User (2); // Создать второй объект с потоком

usl.start (); // Стартовать первый поток

us2.start (); // Стартовать второй поток

System.out.println ("Потоки стартовали");

try

{

Thread.sleep (30);

>

catch (InterruptedException e) { >

usl.suspendUser ( ) ; // Приостановить первый поток

System.out.println ("Первый поток приостановлен");

try

{

Thread.sleep (40);

>

catch (InterruptedExceptlon e) { >

usl.resumeUser ( ); // Возобновить первый поток

System.out.println ("Первый поток возобновлён");

try

{

Thread.sleep (70);

>

catch (InterruptedExceptlon e) { >

>

> /*

Result:

Потоки стартовали

num=l n= 0

num=2 n= 0

num=l n= 1

num=2 n= 1

Первый поток приостановлен

num=2 n= 2

num=2 n= 3

Первый поток возобновлён

num=l n= 2

num=2 n= 4

Thread num=2 finished

num=l n= 3

num=l n= 4

Thread num=l finished

*/

Класс User наследует потоковый класс Thread и включает потоковую

функцию run(). Функция run() выполняет 5 циклов с выдачей номера объекта

и порядкового номера цикла n на консоль.

Выполнение потоковой функции может быть приостановлено (блоки-

рован поток) при истинном значении переменной waiting. Такое значение

присваивает переменной waiting функция suspendUser().

Вызов функции resumeUser() присваивает переменной waiting значение

false и выполняет функцию notify(), которая снимает блокировку потока. По-

ток возобновляет своё выполнение.

Это подтверждает результат работы программы примера 9.6.2.1.1, соз-

давшей и запустившей два потока, один из которых приостанавливается и во-

зобновляется.