Мы кэшируем некоторые объекты из базы данных и часто используем их в GUI нашего приложения Eclipse RCP. Доступ к ним осуществляется через средство визуализации, поэтому вызовы имеют асинхронный характер c.
Перед тем, как получить доступ к объектам, мы выполняем быструю актуальную проверку. Если новые данные доступны, они загружаются, и пользователь видит монитор прогресса.
boolean upToDate = isDatabaseUptoDate();
if(!upToDate) {
cacheData(); //this can take a while and is done with a progressmonitor
}
Теперь проблема в том, что если мы раскошнемем монитор прогресса, следующий асинхронный вызов c начнет выполнение и вызовет тот же метод. Но во время кэширования данных все остальное должно ждать.
Итак, первая идея состояла в том, чтобы использовать семафор, но это всегда будет приводить к тупику, потому что монитор прогресса никогда не сможет завершить sh его выполнение, если GUI потоковые блоки с семафором.
Каков здесь правильный подход?