Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

GrandM-Patterns_in_Java

.pdf
Скачиваний:
98
Добавлен:
14.03.2016
Размер:
8.88 Mб
Скачать

Future - 53

Некоторый объект будет инициировать создание объекта Future. Он будет пе·

редавать объект Future другим объектам, которые будут получать доступ к это· му объекту через интерфейс, ничего не зная о классе объекта Future или О еГ< участии в шаблоне Future. Когда шаблоны Future и Рroху объединяются подоб·

ным образом и вычисление является синхронным, результатом будет шаблOJ­

Virtual Рroху.

З а пус к с и н х ро н н о го в ы ч и сл е н и я

Если объект Future инкапсулирует синхронное вычисление, он должен имеп возможность запустить вычисление при первом вызове его метода getResult Чтобы запустить вычисление, объект Future должен иметь возможность полу·

чить все необходимое для вычисления параметров. Поэтому, если класс Future

инкапсулирует синхронное вычисление, конструктор этого класса должен бу­ дет получить соответствующие параметры с целью задания значений этих пара­ метров для выполнения вычисления.

Ра нд е в у

Реализация класса Future, работающего с асинхронным вычислением, вклю­ чает взаимодействие потока, который вызывает метод getResul t этого класса с целью ожидания завершения вычисления. Существует название для некото­ рого механизма синхронизации нескольких потоков с целью ожидания Toro момента, пока один или некотор- ые из них не достигнут определенной точки. Название этого механизма рандеву.

Класс j ava . lang . Thread содержит метод под названием j oin, который обес­ печивает подходящий способ реализации рандеву. Метод j oi n объекта Thread

не возвращается до тех пор, пока поток не «умрет». Если поток выполняет

асинхронное вычисление, связанное с объектом Future, а затем завершается, то объект Future может вызвать метод j oin этого потока для взаимодействия с ним.

Поток не обязательно должен «умирать» по окончании вычисления. Он может

сделать еще что-то. Он может управляться пулом потоков (щаблон Thread Pool, описанный в книге [Grand2001 ]), который может многократно использовать этот поток для других вычислений. Чтобы реализовать рандеву таким спосо­ бом, который не знает, что будет делать поток после окончания асинхронного вычисления, нужно использовать методы wai t и not ifyAll . Листинг класса

AsynchronousFuture в разделе «Пример кода» служит примером применения

такого способа.

И с кл ю ч е н и я

Если вычисление, связанное с объектом Future, генерирует исключение, нуж­ но, чтобы оно могло быть получено методом, вызвавшим метод getResul t объекта Future. Если вычисление выполняется синхронно, то любые генери­ руемые им исключения, естественно, могут быть получены вне рамок метода getResul t объекта Future.

540 Глава 9. Шаблоны проектирования дпя конкурирующих операций

Если вычисление является асинхронным и генерируется исключение, то есте­

ственный ход событий таков, что исключение будет генерироваться в текущем

активном потоке. Чтобы такое исключение могло быть получено методом,

вызвавшим метод getResul t объекта Future, нужно перехватить это исключе­

ние и задать ссылку на него в одной из переменных экземпляра объекта

Future. Далее можно реализовать метод getResul t так, чтобы этот метод ге­

нерировал исключение, на которое ссьшается переменная экземпляра (если

она не равна nul l).

СЛЕДСТВИЯ

©Классы, использующие вычисление, освобождаются от какой бы то ни

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

©Если вычисление асинхронное, за все детали синхронизации отвечает класс

Future.

ПРИМЕНЕНИЕ В JAVA API

Класс j ava . awt . MediaTracker может служить примером шаблона Future в Java API. Класс MediaTracker инкапсулирует процесс асинхронной загрузки данных изображения в объект ImageProducer, связанный с объектом Image. Он исполняет и роль Requester, и роль Future.

Класс MediaTracker не инкапсулирует результат загрузки данных изображе­ ния. Он просто инкапсулирует процесс загрузки данных. Объект ImagePro­ ducer выполняет роль объекта Resul t.

ПРИМЕР КОдА

Пример кода для этого шаблона основан на проектировании классов, предна­ значенных для считывания текущей информации о погоде, рассматривавшейся

в разделе «Контекст» . Первым представлен класс WeatherRequester, который исполняет роль запрашивающей стороны.

public class WeatherRequester {

/* *

* Объект, который выполняет реаль ную работу

*по считыванию информации о погоде .

*/

WeatherFetchIF fetcher ;

public WeatherRequester (WeatherFetchIF fetcher) { this . fetcher = fetcher;

} // constructor (WeatherFetchIF)

/

* * * *

*

Инициирует процесс получения текущих данных о погоде

/

для

места

с

заданными географическими координатами .

 

 

 

 

public synchronized WeatherFuture getWeather (Coordinate

location)

(

 

return

new WeatherFuture (fetcher , location) ;

}

/ / ge tWeathe r (Coordi nate)

//

class WeatherRequester

Конструктор класса WeatherReques ter создает объект, который делает ре

ную работу по считыванию текущей информации о погоде для данной месI сти. Его метод getWeather создает объект WeatherFuture, передавая его структору объект, предназначенный для реального получения информ о погоде, и объект, описывающий местность, для которой надо получить Формацию о погоде. Класс WeatherFuture исполняет роль Future.

public class WeatherFuture

{

 

/**

 

 

 

*

Когда координата местности передается конструктору,

*

он помещает эту координату, преднаэначенную для запроса ,

*

в данную переменную экземпляра так,

чтобы ее видел новый

 

* /запускаемый поток .

 

 

private Coordinate location ;

 

*

ый

для считывания

текущей информации

/**

Объект, используем

*

о погоде .

 

 

*/

 

 

 

private WeatherFetchIF fetcher

 

/* *

 

 

 

*

Объект, инкапсулирующий логику процесса получения

*

информации .

 

 

*/

 

 

 

private AsynchronousFuture futureSupport

/ * *

 

 

й

*

Создает объект WeatherFuture , которы инкапсулирует

*

получение информации о погоде для данной координаты

*

местности, исполь зуя

заданный объект Wea therFetch I F .

*/

 

 

 

542 Глава 9. Шаблоны проектирования АЛЯ конкурирующих операций

public WeatherFuture (WeatherFetchIF fetcher ,

 

 

 

Coordinate location)

 

 

 

this . fetcher = fetcher;

 

 

 

 

this . location = location;

 

 

 

futureSupport = new AsynchronousFuture ( ) ;

 

new Runner ( ) . start ( ) ;

 

 

 

 

11

cons t ructor (WeatherFetchI F,

Coordinate )

1 * *

 

 

 

 

 

 

*

Возвращает true, если запрошенная информация

 

*1

 

 

 

 

*

о погоде была прочитана .

 

 

public boolean check ( ) {

 

 

 

} *

11

checkResult ( )

 

 

 

 

return futureSupport . checkResult ( ) ;

 

1 * *Возвращает объе т Result

для

этого

объе та Future .

*

1

Если он еще не получен ,

ждет,

по а

он не будет получен .

 

 

public synchronized WeatherIF waitForWeather ( ) throws

Exception {

11return (WeatherIF) futureSupport . qetResult( ) ;

1**

getResu l t ( )

*

* Этот закрытьм класс представляет общую логи у

* 1для асинхронного считывания те ущей информации о погоде .

private class Runner extends Тhread {

 

public void run ( ) {

 

 

try {

= fetcher . fetchWeather (location) ;

 

 

WeatherIF info

 

 

futureSupport . setResult (info) ;

 

 

catch (Exception е) {

 

 

11 try

 

 

11

futureSupport . setException (e) ;

11

run ( )

 

11 class runner

 

 

 

 

class

Weathe rFuture

 

Future

Если информация о погоде прочитана, она инкапсулируется в экзем

класса, который реализует интерфейс под названием Weathe r I F. Логика вления асинхронным вычислением содержится в многократно использ: классе под названием AsynchronousFuture.

public class AsynchronousFuture private Object result i

private boolean resultIsSet;

private Exception problem;

/ * *

* Возвращает true , если результат был получен .

* /

public boolean checkResult ( )

return resultIsSet ;

}

/ /

checkResult ( )

 

 

/ * *

 

 

 

'*

Возвращает объект Result для этого объекта Future .

'*

Если он еще не получен, ждет,

пока

он не будет получен .

'* /

 

 

 

public synchronized Object getResult ( )

throws Exception {

 

while ( ! resultIsSet)

 

 

 

 

wait ( ) ;

 

 

 

}

/ / whi le

 

 

 

if

(problem!=null)

 

 

 

}

/ / if problem

 

 

 

 

throw problemi

 

 

 

return result i

 

 

 

/ /

getResult ( )

 

 

/

 

 

 

 

'* '*

 

 

 

'*

Обращаемся к этому методу для задания результата

'*

вычисления .

 

 

..

Этот метод должен вызываться

только

один раз .

' * /

 

 

 

public synchronized void setResult (Object result)

 

if

(resultIsSet) {

 

 

 

 

String msg = "Result iз already set" ;

 

 

throw new IllеgаlstаtеЕхсерtiоn (mзg) i

544 Глава 9. Шаблоны проектирования АЛЯ конкурирующих операций

this . result = result;

resultIsSet = true ;

notifyAll ( ) ;

// setResul t (Obj ec t )

/ * *

*

Если асинхронное вычисление , связанное с этим объектом,

*

генерирует исключение , передаем исключение этому методу,

* и исключение будет снова сгенерировано методом getResult .

*/

public synchronized void setException (Exception е) ( problem = е ;

resultIsSet = true ; notifyAll ( ) ;

//setExcept ion (Exception )

//class AsynchronousFuture

ШАБЛОНЫ ПРОЕКТИРОВАНИЯ, СВЯЗАННЫЕ С ШАБЛОНОМ FUTURE

Asynchronous Processing. Шаблон Asynchronous Processing позволяет делать вы­ числение асинхронным. Он часто используется вместе с шаблоном Future.

Observer. Использование шаблона ObseIVer представляет собой альтернативный вариант технологии реализации опроса в объекте Future для определения, было

ли завершено связанное с ним асинхронное вычисление.

Proxy. Шаблон Future может объединяться с шаблоном Ргоху с тем, чтобы объ­

ект Future являлся также заместителем для объекта, который выполняет основ­ ное вычисление.

Virtual Proxy. Если шаблон Future объединяется с шаблоном Ргоху и вычисле­

ние синхронное, то получается шаблон Virtual Proxy.

Active Object. Шаблон Active Object, представленный в [SSRBOO), описывает

способ объединения шаблона Future с шаблоном Asynchronous Processing.

СПИСОК ЛИТЕРАТУРЫ

[App1eton97]wwwBrad App1eton. «Patterns and Software: Essential Concepts and Termi nology.» .enteract.comjbradapp/docs/patterns-intro.html.

[ASU86] Alfred У. Лhо, Ravi Seti, and JefТery О. Ullman. Compilers, Principles, Tech niques and Too/s. Reading, Mass.: Addison-Wesley, 1986.

[Bentley86] Jon Louis Bentley. Programming Pearls. New York: АСМ, 1986.

[BMRSS96] Frank Buschmann, Regine Meunier, Hans Rohnert,J:Peter Sommerlad and Michael Stal. Pattern-Oriented So/tware& Architecture, Volume А System о/ Ра! tems. Chichester, England: John Wiley Sons, 1996.

[GoF95] Erich ааmmа, Richard Helm, Ralph Johnson, and John Vlissides. Desig, Patterns: Elements о/ ReusabIe Object-Oгiented Software. Reading, Mass.: Addi son-Wesley, 1995.

[Grand99] Grand Mark. Patterns2. in Java: А Catalog о/ ReusabIe Design Pattems Illus trated with UML, Volume Wiley, 1999.

[Grand2001 ] Grand Mark. Java Enterprise Design Pattems: Pattems in Java, Volume j

Wiley, 2001.

[Larman98] Craig Larman. App/ying UML and Patterns. Upper Saddle River, N.J Prentice НаН PTR, 1998.

[Lea97] Doug Lea. Concurrent Programming in Java. Reading, Mass.: Addison-Wesle) 1997.

[LLO] ] Timothy С. Lethbridge and Robert Laganiere. Object-Oriented So/tware Engi neeгing: Practica/ Software Deve/opment Using UML and Java. New York: МсGгаw-НiI1 2001.

[RhieI2000]wwwDirk Rhiel. Fundamenta/ Class Pattems in Java. UnpubIished manuscrip (in 2000). .riehle.org/papers/2000/plop-2000-class-pattems.html.

[Ritchie84] О. Ritchie. «А Stream Input-Output System,» АТ&Т Ве// Labs TechnicG Jouma/, vol. 63, рр. 3 1 1-324. October 1984.

[SSRBOO] Douglas Schmidt, Micheal Stal, Hans2. Rohnert, and Frank Buschmann

Pattern Oriented So/tware Architecture, Volume Chichester, England: John Wiley Sons, 2000. www

[Woolf97] ВоЬЬу Woolf. «The Null Object Pattern.» .ksccary.com/nullobj.htm

ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ

А

AbstractBuilder, класс 136 AbstractCommand, класс 323 AbstractCommandHandler, класс 313 AbstractComposite, класс 194 AbstractElement, класс 433

Abstract Factory, шаблон 109, 1 19, 123- 1 3 1 , 151, 239

использование 1 23-127 применение в Java АРI 1 28 пример кода 1 28-131 связанные шаблоны 1 3 1 следствия 1 27 - 128

AbstractAyweight, класс 252 AbstractionImpl, интерфейс 23 1 AbstractLoadableClass, класс 263 AbstractNonterminal,РиН класс 346 Abstract Filter, класс 184 AbstractPushFilter, класс 185- 1 86 Abstract ServiceIF, интерфейс 282 Abstract Superclass, шаблон 6 1 , 75-85

использование 75-76 применение в Java API 77 пример кода 77-79 роль классов 76 связанные шаблоны 79 следствия 77

AbstractTemplate, класс 424 AbstractWrapper, класс 282-283 Active Object, шаблон 533, 544 Actors 43

Adaptee, класс 2 1 5-216 Adaptcr, класс 2 1 5, 216

Adapter, шаблон 74, 21 1 , 213-221 , 226, 247, 372, 400, 420-42 1

использование 213-218 применение в Java АРI 219-220 связанные шаблоны 220-221 следствия 218-219

addShutdownHook, метод 504 Anonymous Adapter, шаблон 74, 221

Asynchronous Processing, шаблон 442, 521-533, 544

использование 521 -528 применение в Java АРI 528-529 пример кода 529-532 связанные шаблоны 532-533

в следствия 528

Balking, шаблон 442, 467, 468-472

использование 468-469 пример кода 471-472 связанные шаблоны 472 следствия 470

BeanInfo 207-208

Bridge, шаблон 1 27128, 2 1 1 , 227-239

использование 227-232 применение в Java API 232 пример кода 232-238 связанные шаблоны 238-239 следствия 232

Builder, шаблон 108, 133141

использование 132- 1 38 пример кода 138141 связанные шаблоны 141 следствия 138

с

Cache, объект 290

Cache Management, шаблон 161 , 179, 212, 259. 287-307

использование 287-296 пример кода 297-307 связанные шаблоны 307 следствия 296-297

CacheManager. объект 290

САО - см. Computer-Assisted Design Caretaker. класс 379

Chain of Responsibility. шаблон 203, 309. 31 1-32 1

использование 3 1 1-314

548

пре

 

етный

у

ка

з

а

тел

ь

 

 

дм

 

 

 

 

передача команд 314

 

 

 

 

 

 

применение в Java АР1

316-3 1 7

 

пример кода 317-321

 

 

 

 

 

 

связанные шаблоны 321

 

 

 

 

 

следствия 3 1 5

 

 

 

 

 

 

 

 

Client, класс 7 1 ,

126, 136, 144, 165, 215,

253, 274, 289, 345, 417, 432, 536

проблемы 65

 

 

 

 

 

 

 

 

Clone, метод 99, 142143, 145146

Colleague1 . . ., классы 363-364

 

 

Collection, класс 223

 

 

 

 

 

 

CollectionIF, интерфейс 223

 

 

 

Command, шаблон 32 1 ,

322-332, 390

использование 322-326

 

 

 

 

 

применение в Java АРl

327

 

 

 

 

пример кода 327-332

 

 

 

 

 

 

связанные шаблоны 332

 

 

 

 

 

следствия 326-327

 

 

 

 

 

 

CommandHandlerIF, интерфейс 313

CommandManager, класс 324

 

 

CommandSender, класс 313

 

 

 

 

Component, класс 232

 

 

 

 

 

 

Component1 . . ., классы 194

 

 

 

 

ComponentIF, интерфейс 194

 

 

Composite, шаблон 141,

151,

1 8 1 ,

191,

192-203, 259, 32 1, 359, 439

 

использование 192-196

 

 

 

 

 

применение в Java API 197

 

 

 

 

пример кода 197-203

 

 

 

 

 

 

связанные шаблоны 203

 

 

 

 

 

следствия 196-197

 

 

 

 

 

 

Computer-Assisted Design

(САО) програм-

мы 142143

 

 

 

 

 

 

 

 

ConcreteBuilder, класс 136

 

 

 

 

ConcreteClassl . . . ,

 

классы 76

 

 

 

 

ConcreteCommand, класс 323-324

ConcreteCommandHandlerl .. . ,

классы 313

ConcreteComposite l .. ., объекты 195

ConcreteElementl . . . , классы 433-434

ConcreteFactoryl. . . , классы 126

 

ConcreteLoadabIeClass, класс 263

 

ConcreteNonterтninall. . ., классы 346

ConcreteProductl .. ., классы

1 1 2

 

ConcretePullFilter, класс 184

 

 

 

ConcretePushFilter, класс 186

 

 

ConcreteService, класс 282

 

 

 

 

ConcreteStatel . . . , классы 406

 

ConcreteStrategyl . . ., классы 418

 

ConcreteTemplate, класс 425

 

ConcreteVisitorl ... , классы 434

 

ConcreteWrapperA... , классы 283

 

Consumer, класс 495

 

Context, класс 405

 

Controller, шаблон 372

 

CreationRequester, класс 1 12

 

Critical Section, шаблон - см. Single

 

Тhreaded Execution, шаблон

 

D

 

Data, объект 485-486

 

Deadlock - см. Взаимная блокировка

 

Deadly embrace - см. Взаимная блоки-

ровка

 

Decorator, шаблон 105, 1 5 1 , 168, 191, 212,

232, 239, 280-286

 

альтернатива наследованию 284

 

использование 280-283

 

пример кода 284-286

 

связанные шаблоны 286

 

следствия 284

 

Delegation, шаблон 61, 62-69, 74, 286,

 

400

 

использование 62-66

 

применение в Java API 67

 

пример кода 67-68

 

связанные шаблоны 69

 

следствия 66-67

 

Delegator, класс 413

 

Director, объект 137

 

ОоиЫе Buffering, шаблон 442, 504-520

 

использование 504-508

 

применение в Java API 508-509

 

пример кода 509-520

 

связанные шаблоны 520

 

следствия 508

 

Dynamic Linkage, шаблон 212, 260-270

использование 260-265

 

применение в Java API 265-266

 

пример кода 266-269

 

4

265

риск при нарушении безопасности 26 -

 

связанные шаблоны 270

 

следствия 265

 

Е

 

enter, метод 405

 

Environment, класс 263

EnvironmentIF, интерфейс 262

Ephemeral Cache Нет, шаблон 307

EventListenerl ...

, интерфейсы 364

exit, метод 405

 

expect, метод 353

F

 

Facade, шаблон 54, 105, 1 5 1 , 2 1 1 , 220,

240-247, 279, 307, 532-533

использование 240-243

применение в Java АРI 244

пример кода 244-246

связанные шаблоны 246-247

следствия 243

 

Factory, класс 1 13

FactoryIF, интерфейс 1 12- 1 1 3, 126

Factory Method, шаблон 56, 107, 109122,

1 3 1 , 141, 1 5 1 , 1 79, 226, 259, 332

варианты 1 1 3

 

использование 109- 1 15

применение в Java АРI 1 15- 1 16

пример кода 1 16- 1 22

связанные шаблоны 122

следствия 1 15,

1 24

Filter, шаблон 1 8 1 , 182191, 286

риН-форма 1 83- 1 84

рush-форма 1 83186

использование 1 82- 1 86

применение в Java АРI 187

пример кода 1 87-191

связанные шаблоны 191

следствия 1 86187

FilterReader, класс 187

FilterWriter, класс 187

Flyweight, шаблон 195196, 21 1 ,

248-259, 410, 42 1

использование 248-254

применение в Java АРI 254

пример кода 254-259

связанные шаблоны 259

следСТВИЯ 254

 

Предметный указатель 549

FlyweightFactory, класс 253 Future, класс 536-537

Future, шаблон 442, 533, 534-544

использование 534-540 применение в Java АРI 542 пример кода 540-544 связанные шаблоны 540 следствия 540

G

getInstance, метод и множественныс пото­ ки 156157

getTreeLock, мстод 458

Guarded Suspension, шаблон 442, 460-467, 472, 495-496, 498, 520

использование 460-АР464I применение в Java 465 пример кода 466 связанные шаблоны 467

следствия 464

н

Hashed Adapter Objects, шаблон 1 15, 122 Hit rate 29 1

Нооk-методы 425-426

ImmutabIe, шаблон 61, 86-90, 259

использование 86-88 применение в Java API 89 пример кода 89 связанные шаблоны 90 следствия 88-89

Impl lj2, классы 231 IndirectionlF, интерфейс 71 IпрutStrеаm, класс 345-346

Interface, шаблон 6 1 , 70-74, 80, 85, 141,

210, 246, 372

использование 70-72 применение в Java АРI 72 пример кода 73-74 связанные шаблоны 74 следствия 72

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]