E4: Синхронизация для кэширования с progressmonitor из нескольких асин c вызовов - PullRequest
0 голосов
/ 23 марта 2020

Мы кэшируем некоторые объекты из базы данных и часто используем их в GUI нашего приложения Eclipse RCP. Доступ к ним осуществляется через средство визуализации, поэтому вызовы имеют асинхронный характер c.

Перед тем, как получить доступ к объектам, мы выполняем быструю актуальную проверку. Если новые данные доступны, они загружаются, и пользователь видит монитор прогресса.

boolean upToDate = isDatabaseUptoDate();
if(!upToDate) {
    cacheData(); //this can take a while and is done with a progressmonitor
}

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

Итак, первая идея состояла в том, чтобы использовать семафор, но это всегда будет приводить к тупику, потому что монитор прогресса никогда не сможет завершить sh его выполнение, если GUI потоковые блоки с семафором.

Каков здесь правильный подход?

...