2015-08-05 3 views
1

У меня есть многопоточное приложение с одним потоком, который владеет несколькими объектами - периодически обновляет их. Другой поток должен получить доступ к этим объектам и использовать его для некоторой операции. Какой образец подойдет мне?Шаблон проектирования для мониторинга нескольких объектов

+0

Не могли бы вы рассказать о прецеденте? – gyan

+0

В основном мне нужно отслеживать несколько датчиков из потока и получать доступ к значениям датчиков из другого потока, чтобы выполнить фоновое задание, например, проверить его на некоторый порог пересечения. –

ответ

2

Вы, вероятно, ищете Observer Pattern

В двух словах, его как - Ваш основной поток будет слушать «события», генерируемых датчик потоками. Таким образом, этапы могут быть следующими:

A) Потоки сенсора выставляют метод, чтобы регистр основного потока для события. Для этого используйте интерфейс.

B) Как только данные изменятся внутри датчика, он вызовет метод в основном потоке (обратите внимание, что он имеет ссылку на этапе A). Таким образом, основной поток узнает, что его время для действий.

+0

Спасибо. Даже моя первая склонность была направлена ​​на образец Наблюдателя. Но когда мы смотрим на это, схема Observer облегчает жизнь в случае нескольких наблюдателей по одному предмету. В то время как Im ищет что-то, где есть несколько предметов и один наблюдатель, - например, в моем случае есть несколько датчиков и основной поток, из которых я хотел бы объединить все значения датчиков и может периодически регистрировать его в файле. –

+0

Если вы хотите периодически получать данные датчиков (независимо от их изменения или нет); просто перебирайте набор датчиков в заданное время. Используйте простой Java-таймер, который будет вызывать метод в основном потоке, и метод будет собирать данные датчика. См. Http://www.tutorialspoint.com/java/util/timer_schedule_period.htm .... Дайте мне знать, если это решение, я обновлю решение. – gyan

+0

В этом случае шаблон Observer по-прежнему подходит. – neontapir

1

В шаблоне Observer вы должны Метод уведомления

public void Notify() 
    { 
     this.observers.ForEach(x => x.Update()); 
    } 

То, что вы хотите, для наблюдателей, (вы можете иметь только один наблюдатель), чтобы знать о каждом предмете так, то он может регистрировать значения , Таким образом, вы можете передать объект методу обновления.

public void Notify() 
    { 
     this.observers.ForEach(x => x.Update(this)); 
    } 

и в методе Update наблюдателя вы можете войти и проверить порог пересечения

public void Update(Subject subject) 
    { 
     if(subject.Value > 5) 
      Log.Write(subject.Value) 
    } 

Вы можете иметь несколько объектов с подпиской на тот же объект Observer.

 subject1.Subscribe(observer1); 
     subject2.Subscribe(observer1);