Схема приложения

 
 
 
Сообщения:85
Большая просьба идейно помочь со схемой многопоточности в приложении, то есть где какие стандартные объекты/паттерны использовать, чтобы уже по факту такой схемы разбирать как и что работает, чтобы сделать работоспособное приложение.

В целом задача приложения сводится к подключению в базе для получения и агрегации из нее данных в отдельном классе, а затем одновременного/параллельного анализа этих данных по разным критериям.

Визуально это выглядит так - запускается главное окно, в нем могут меняться настройки подключения к бд и интервал получения новых данных из базы, соответственно по имеющимся настройкам происходит подключение к базе, если настройки меняются, то должно либо происходить переключение на другую базу и/или изменяться интервал опроса новых данных. Из главного окна пользователь создает произвольно количество отдельных окон, в каждом, из которых делаются настройки - условные критерии анализа данных и интервал повторного обсчета этих данных. Таким образом, "задача" таких "аналитических окон" по настройкам производить расчеты и выводить результат в этих же окнах с заданной периодичностью. Работа (обсчет данных) таких окон напрямую зависит от получения новых данных из базы основным процессом, нет новых данных - расчеты не производятся, есть производятся. Также, если пользователь меняет условия работы в таком окне, то новые условия должны применять при последующих запусках.

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

Буду очень признателен, если кто откликнется, потому как для новичка трудно понять какие инструменты использовать, а подобная задача самое то, чтобы разобраться как и что работает и как это можно использовать..
 
 
Сообщения:244
В общих чертах объяснить не сложно.

Если есть некоторые периодические операции, то берем ScheduledExecutorService.scheduleAtFixedRate/Delay в зависимости от задачи. Эти методы возвращают ScheduledFuture, на котором можно вызывать cancel(), если больше повторять операцию не требуется (поменяли настройки/закрыли окно).

Далее есть параметры подключения к базе и данные, подтнянутые из базы.

Когда ввели параметры подключения - создаем Runnable, кладем параметры ему в поля и отправляем его в ScheduledExecutorService, если параметры поменялись, то делаем на нем cancel и создаем новый.

"Аналитические окна" складываем в ConcurrentHashMap или другую конкурентную коллекцию.

Далее наш Runnable достает данные из базы данные и формирует из них некий immutable объект, итерируется по списку аналитических окон и для каждого из них сабмитит в какой-нибудь тред пул (можно в тот же ScheduledExecutorService) новый Runnable, который в поле содержит данные из базы и выполняет процессинг.

Данные должны быть immutable, чтобы их случайно не поменяли в процессе.

Если данные в базе не поменялись, тогда сабмитить вторичные Runnable-объекты не нужно.
 
 
Сообщения:85
спасибо, посмотрю, подумаю
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет