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

Importjava.Utll.*;

class CGenEv extends Observable // Класс наблюдаемого объекта

{

public void GenerateEv (String str ) // Осуществить уведомление

{

setChanged ( );

notifyObservers (new String (str));

>

>

class CThread extends Thread implements Observer // Класс обозревателя

{

boolean received;

String st;

lnt num;

boolean life;

public CThread (int Num ) {num= Num; life= false; received= false;>

public void Start ( )

{

If (lllfe)

{

life= true;

this.start ();

>

>

public void Finish ( ) <iife= false;}

public void update (Observable obj, Object arg)

{

received= true;

st= ((String)arg).toString ( );

>

public void run ( )

{

int n= 0;

while (life)

{

n+ + ;

System.out.println ("thread " + num + " n= " + n);

If (received)

{

received= false;

System.out.println ("The thread received message: " +

st);

}

try

{

Thread.sleep (50);

>

catch(InterruptedException e) { >

>

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

>

>

class i estTnreaa

{

public static void main ( )

{

CThread thread= new CThread (1);

CGenEv genEv= new CGenEv ( );

genEv.addObserver (thread);

try

{

thread.Start ( );

Thread.sleep (100);

}

catch (lnterruptedException e) { >

genEv.GenerateEv ("hello");

try

{

Thread.sleep (100);

>

catch (InterruptedException e) { >

thread.Finish ();

>

/>*

Result:

thread 1 n= 1

thread 1 n= 2

thread 1 n= 3

The thread received message: hello

thread 1 n= 4

Thread 1 finished

*/

Уведомления языка Java сродни с событиями языка C#. Об этом под-

робно было рассказано в разделе 8.4.

Класс CGenEv источника события, являясь классом наблюдаемого

объекта, обязан наследовать класс Observable и реализовать две функции:

setChanged() и notifyObservers(). Аргументом функции notifyObservers() явля-

ется объект типа String, инкапсулирующий передаваемую обозревателю

строку str.

Обозреватель - объект класса CThread, содержит поток и должен по-

лучать уведомления. Поэтому класс CThread должен наследовать интерфейс

Observer и класс Thread. Интерфейс Observer обязывает класс реализовать

обработчик update() уведомлений.

В функции main() функция addObserver() подписывает обозреватель

thread на уведомления из наблюдаемого объекта genEv.

9.6. Синхронизация выполнения потоков

П л « л п ч л п г i m n r T n n n i T n a t i T i a п л т л о т ! « ( п г ч ш 11ЛГ1Лrv> олпO*T*T n ^ ^ n e n n o i > t t a

1 l t t p < < U U I W t D n V D O l l l V J t n i A V i n o i V I l U 1 V / A M i n V i J L r i V U 4 A U P J V D U l D p t t J ^ W l 4 w i V i O i V

ресурсы. Например, несколько потоков используют некоторую таблицу, за-

полняя её данными и извлекая из неё информацию. При неконтролируемом

одновременном обращении к таблице каждый из этих потоков может извлечь

часть уже изменённых каким-либо другим потоком, так и часть ещё неизме-

нённых старых данных, которые совместно не отражают её надлежащее но-

вое состояние. Поэтому здесь требуется синхронизация выполнения парал-

лельных потоков - пока некоторый поток модифицирует таблицу, выполне-

ние других потоков должно быть приостановлено и возобновлено после

окончания модификации. Затем им может быть предоставлен параллельный

не синхронизированный доступ к таблице, если потоки только извлекают

информацию.

Среди средств синхронизации параллельного выполнения потоков,

предоставленных .NET Framework, мы рассмотрим класс Monitor, а в языке

Java - специальные функции wait(), notify() и notifyAH().

Но в начале познакомимся с особыми операторами lock языка C# и synchronized

языка Java, предназначенными для синхронизированного выполне-

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

ставного оператора.