WikiDer > Активный объект
В активный объект шаблон дизайна отделяет выполнение метода от вызова метода для объектов, каждый из которых находится в своем собственном нить контроля.[1] Цель - познакомить параллелизм, используя вызов асинхронного метода и планировщик для обработки запросов.[2]
Узор состоит из шести элементов:[3]
- А доверенное лицо, который предоставляет интерфейс для клиентов с общедоступными методами.
- Интерфейс, который определяет запрос метода для активного объекта.
- Список ожидающих запросов от клиентов.
- А планировщик, который решает, какой запрос выполнить следующим.
- Реализация метода активного объекта.
- А Перезвоните или же Переменная чтобы клиент получил результат.
Пример
Ява
Пример шаблона активного объекта в Ява.[4]
Во-первых, мы можем увидеть стандартный класс, который предоставляет два метода, которые устанавливают двойное значение как определенное значение. Этот класс делает НЕТ соответствовать шаблону активного объекта.
учебный класс Мой класс { частный двойной вал = 0.0; пустота сделай что-нибудь() { вал = 1.0; } пустота doSomethingElse() { вал = 2.0; }}
Класс опасен в сценарии многопоточности, потому что оба метода могут быть вызваны одновременно, поэтому значение val (которое не является атомарным - оно обновляется в несколько шагов) может быть неопределенным - классическое состояние гонки. Конечно, вы можете использовать синхронизацию для решения этой проблемы, что в этом тривиальном случае легко. Но как только класс становится реально сложным, синхронизация может стать очень сложной. [5]
Чтобы переписать этот класс как активный объект, вы можете сделать следующее:
учебный класс MyActiveObject { частный двойной вал = 0.0; частный BlockingQueue<Работоспособен> dispatchQueue = новый LinkedBlockingQueue<Работоспособен>(); общественный MyActiveObject() { новый Нить (новый Работоспособен() { @Override общественный пустота пробег() { пока (истинный) { пытаться { dispatchQueue.брать().пробег(); } ловить (InterruptedException е) { // хорошо, просто завершаем диспетчер } } } } ).Начните(); } пустота сделай что-нибудь() бросает InterruptedException { dispatchQueue.положить(новый Работоспособен() { @Override общественный пустота пробег() { вал = 1.0; } } ); } пустота doSomethingElse() бросает InterruptedException { dispatchQueue.положить(новый Работоспособен() { @Override общественный пустота пробег() { вал = 2.0; } } ); }}
Java 8 (альтернатива)
Другой пример шаблона активного объекта в Java, реализованный в Java 8, обеспечивает более короткое решение.
общественный учебный класс Мой класс { частный двойной вал; // контейнер для задач // решает, какой запрос выполнить следующим // asyncMode = true означает, что наш рабочий поток обрабатывает свою локальную очередь задач в порядке FIFO // только один поток может изменять внутреннее состояние частный окончательный ForkJoinPool fj = новый ForkJoinPool(1, ForkJoinPool.defaultForkJoinWorkerThreadFactory, ноль, истинный); // реализация метода активного объекта общественный пустота сделай что-нибудь() бросает InterruptedException { fj.выполнять(() -> { вал = 1.0; }); } // реализация метода активного объекта общественный пустота doSomethingElse() бросает InterruptedException { fj.выполнять(() -> { вал = 2.0; }); }}
Смотрите также
- Параллельное объектно-ориентированное программирование
- Актерская модель
- Будущее и обещания
- Живой распределенный объект
Рекомендации
- ^ Дуглас С. Шмидт; Михаил Сталь; Ганс Ронерт; Фрэнк Бушманн (2000). Шаблонно-ориентированная архитектура программного обеспечения, Том 2: Шаблоны для параллельных и сетевых объектов. Джон Вили и сыновья. ISBN 0-471-60695-2.
- ^ Басс, Л., Клементс, П., Казман, Р. Архитектура программного обеспечения на практике. Эддисон Уэсли, 2003
- ^ Лаванда, Р. Грег; Шмидт, Дуглас К. «Активный объект» (PDF). Архивировано из оригинал (PDF) на 2012-07-22. Получено 2007-02-02.
- ^ Голуб, Аллен. «Активные объекты Java - предложение». Архивировано из оригинал на 2013-06-22. Получено 2014-06-16.
- ^ Голуб, Аллен. «Активные объекты Java - предложение». Архивировано из оригинал на 2013-06-22. Получено 2014-06-16.
внешняя ссылка
- Сверхвысокопроизводительное промежуточное ПО на основе активного объекта Disruptor в C ++ 14
- Реализация активного объекта в C ++ 11
Этот компьютерное программирование-связанная статья является заглушка. Вы можете помочь Википедии расширяя это. |