У меня есть многопоточное приложение с одним потоком, который владеет несколькими объектами - периодически обновляет их. Другой поток должен получить доступ к этим объектам и использовать его для некоторой операции. Какой образец подойдет мне?Шаблон проектирования для мониторинга нескольких объектов
ответ
Вы, вероятно, ищете Observer Pattern
В двух словах, его как - Ваш основной поток будет слушать «события», генерируемых датчик потоками. Таким образом, этапы могут быть следующими:
A) Потоки сенсора выставляют метод, чтобы регистр основного потока для события. Для этого используйте интерфейс.
B) Как только данные изменятся внутри датчика, он вызовет метод в основном потоке (обратите внимание, что он имеет ссылку на этапе A). Таким образом, основной поток узнает, что его время для действий.
Спасибо. Даже моя первая склонность была направлена на образец Наблюдателя. Но когда мы смотрим на это, схема Observer облегчает жизнь в случае нескольких наблюдателей по одному предмету. В то время как Im ищет что-то, где есть несколько предметов и один наблюдатель, - например, в моем случае есть несколько датчиков и основной поток, из которых я хотел бы объединить все значения датчиков и может периодически регистрировать его в файле. –
Если вы хотите периодически получать данные датчиков (независимо от их изменения или нет); просто перебирайте набор датчиков в заданное время. Используйте простой Java-таймер, который будет вызывать метод в основном потоке, и метод будет собирать данные датчика. См. Http://www.tutorialspoint.com/java/util/timer_schedule_period.htm .... Дайте мне знать, если это решение, я обновлю решение. – gyan
В этом случае шаблон Observer по-прежнему подходит. – neontapir
В шаблоне 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);
Не могли бы вы рассказать о прецеденте? – gyan
В основном мне нужно отслеживать несколько датчиков из потока и получать доступ к значениям датчиков из другого потока, чтобы выполнить фоновое задание, например, проверить его на некоторый порог пересечения. –