Jump to content

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

(Перенаправлено с активного объекта )

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

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

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

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

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

class MyClass {

    private double val = 0.0;
    
    void doSomething() {
        val = 1.0;
    }

    void doSomethingElse() {
        val = 2.0;
    }
}

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

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

class MyActiveObject {

    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) {   
                        // okay, just terminate the dispatcher
                    }
                }
            }
        ).start();
    }

    void doSomething() throws InterruptedException {
        dispatchQueue.put(new Runnable() {
                @Override
                public void run() { 
                    val = 1.0; 
                }
            }
        );
    }

    void doSomethingElse() throws InterruptedException {
        dispatchQueue.put(new Runnable() {
                @Override
                public void run() { 
                    val = 2.0; 
                }
            }
        );
    }
}

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

[ редактировать ]

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

public class MyClass {
    private double val; 
    
    // container for tasks
    // decides which request to execute next 
    // asyncMode=true means our worker thread processes its local task queue in the FIFO order 
    // only single thread may modify internal state
    private final ForkJoinPool fj = new ForkJoinPool(1, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
    
    // implementation of active object method
    public void doSomething() throws InterruptedException {
        fj.execute(() -> { val = 1.0; });
    }
 
    // implementation of active object method
    public void doSomethingElse() throws InterruptedException {
        fj.execute(() -> { val = 2.0; });
    }
}

См. также

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


Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d404825bf6ddc54cb2879504f3f7428f__1711477860
URL1:https://arc.ask3.ru/arc/aa/d4/8f/d404825bf6ddc54cb2879504f3f7428f.html
Заголовок, (Title) документа по адресу, URL1:
Active object - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)