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

В активный объект шаблон дизайна отделяет выполнение метода от вызова метода для объектов, каждый из которых находится в своем собственном нить контроля.[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; });    }}

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

Рекомендации

  1. ^ Дуглас С. Шмидт; Михаил Сталь; Ганс Ронерт; Фрэнк Бушманн (2000). Шаблонно-ориентированная архитектура программного обеспечения, Том 2: Шаблоны для параллельных и сетевых объектов. Джон Вили и сыновья. ISBN  0-471-60695-2.
  2. ^ Басс, Л., Клементс, П., Казман, Р. Архитектура программного обеспечения на практике. Эддисон Уэсли, 2003
  3. ^ Лаванда, Р. Грег; Шмидт, Дуглас К. «Активный объект» (PDF). Архивировано из оригинал (PDF) на 2012-07-22. Получено 2007-02-02.
  4. ^ Голуб, Аллен. «Активные объекты Java - предложение». Архивировано из оригинал на 2013-06-22. Получено 2014-06-16.
  5. ^ Голуб, Аллен. «Активные объекты Java - предложение». Архивировано из оригинал на 2013-06-22. Получено 2014-06-16.

внешняя ссылка