Друзья, подскажите такую вещь.
Есть сервер tomcat, есть хитрозаточенный сервер приложений на нем, все это legacy code. [Псевдо]параллельное исполнение кода в нем реализовано через установку атрибутов и листенеры. Есть некий метод, который выполняет подготовительную работу (загружает в БД данные из внешнего источника) и потом выставляет разные атрибуты, в результате чего запускаются разные обработчики этих данных. Как я понимаю, порядок вызова обработчиков в этом случае не гарантирован и мы можем считать, что они выполняются параллельно в разных потоках. Но теперь потребовалось внести в этот беспорядок немного синхронности. Необходимо сделать так, чтобы этот самый "головной метод" (который вызывает обработчики посредством установки атрибутов) ждал завершения отработки некоторого из вызываемых им обработчиков, затем вносил определенные изменения в данные, затем вызывал другой/другие обработчики. Примерно так:
// Код работает в контексте сервлета, активизируемого через HTTP-запрос
// Здесь мы загружаем данные из внешнего источника
...
// Вызываем обработчик-1
servletContext.setAttribute("Processor1", "1");
// А здесь надо ждать, пока листенер атрибута Processor1 не завершит работу
// Разумеется, необходимо предусмотреть таймаут
...
// Далее мы выполняем манипуляции над загруженными данными
...
// Вызываем обработчик-2
servletContext.setAttribute("Processor2", "1");
Как нынче принято выполнять в Java подобную синхронизацию? Какие объекты Java лучше использовать?