Активный объект

Шаблон проектирования активных объектов разделяет выполнение метода и вызов метода для объектов, каждый из которых находится в своем собственном потоке управления. [1] Цель состоит в том, чтобы внедрить параллелизм , используя асинхронный вызов метода и планировщик для обработки запросов. [2]

Узор состоит из шести элементов: [3]

  • Прокси -сервер , который предоставляет интерфейс для клиентов с общедоступными методами.
  • Интерфейс, определяющий запрос метода для активного объекта.
  • Список ожидающих обработки запросов от клиентов.
  • Планировщик , который решает , какой запрос выполнить следующим.
  • Реализация метода активного объекта.
  • Обратный вызов или переменная для получения клиентом результата.

Пример

Ява

Пример шаблона активного объекта в Java . [4]

Во-первых, мы видим стандартный класс, который предоставляет два метода, которые устанавливают double в определенное значение. Этот класс НЕ соответствует шаблону активного объекта.

класс  МойКласс {  частный двойной val = 0.0 ; void doSomething () { val = 1.0 ; }             void doSomethingElse () { val = 2.0 ; } }      

Класс опасен в многопоточном сценарии, потому что оба метода могут быть вызваны одновременно, поэтому значение val (которое не является атомарным — оно обновляется в несколько шагов) может быть неопределенным — классическое состояние гонки. Конечно, вы можете использовать синхронизацию для решения этой проблемы, что в этом тривиальном случае легко. Но как только класс становится реалистично сложным, синхронизация может стать очень сложной. [5]

Чтобы переписать этот класс как активный объект, можно сделать следующее:

класс  МойАктивныйОбъект {  private double val = 0.0 ; private BlockingQueue < Runnable > dispatchQueue = new LinkedBlockingQueue < Runnable > ();           public MyActiveObject () { new Thread ( new Runnable () { @Override public void run () { try { while ( true ) { dispatchQueue . take (). run (); } } catch ( InterruptedException e ) { // хорошо, просто завершаем работу диспетчера } } } ). start (); }                                 void doSomething () выдает InterruptedException { dispatchQueue.put ( new Runnable ( ) { @Override public void run () { val = 1.0 ; } } ) ; }                      void doSomethingElse () выдает InterruptedException { dispatchQueue.put ( new Runnable () { @Override public void run ( ) { val = 2.0 ; } } ) ; } }                     

Java 8 (альтернатива)

Другой пример шаблона активного объекта в Java, реализованный в Java 8, предоставляющий более короткое решение.

public class MyClass { private double val ; // контейнер для задач // решает, какой запрос выполнить следующим // asyncMode=true означает, что наш рабочий поток обрабатывает свою локальную очередь задач в порядке FIFO // только один поток может изменять внутреннее состояние private final ForkJoinPool fj = new ForkJoinPool ( 1 , ForkJoinPool . defaultForkJoinWorkerThreadFactory , null , true ); // реализация метода активного объекта public void doSomething () throws InterruptedException { fj . execute (() -> { val = 1.0 ; }); } // реализация метода активного объекта public void doSomethingElse () throws InterruptedException { fj . execute (() -> { val = 2.0 ; }); } }                                                      

Смотрите также

Ссылки

  1. ^ Дуглас С. Шмидт ; Майкл Стал; Ганс Ронерт; Фрэнк Бушманн (2000). Архитектура программного обеспечения, ориентированная на шаблоны, том 2: Шаблоны для параллельных и сетевых объектов . John Wiley & Sons. ISBN 0-471-60695-2.
  2. ^ Басс, Л., Клементс, П., Казман, Р. Архитектура программного обеспечения на практике . Addison Wesley, 2003
  3. ^ Лавендер, Р. Грег; Шмидт, Дуглас К. "Активный объект" (PDF) . Архивировано из оригинала (PDF) 2012-07-22 . Получено 2007-02-02 .
  4. ^ Холуб, Аллен. "Java Active Objects - A Proposal". Архивировано из оригинала 2013-06-22 . Получено 2014-06-16 .
  5. ^ Холуб, Аллен. "Java Active Objects - A Proposal". Архивировано из оригинала 2013-06-22 . Получено 2014-06-16 .
  • Сверхвысокопроизводительное промежуточное программное обеспечение на основе Disruptor Active Object в C++14
  • Реализация Active Object в C++11


Получено с "https://en.wikipedia.org/w/index.php?title=Активный_объект&oldid=1215743948"