Я задаю этот вопрос, специфичный для данного варианта использования, в отношении того, что является наилучшим и наиболее экономичным и элегантным способом достижения следующего:
public class MyClass {
private final AtomicBoolean _myValue = new AtomicBoolean(false);
public MyClass(MyApi someApi, Executor executor) {
_someApi = someApi;
_executor = executor;
}
public startSession() {
updateValue();
}
public sessionEnded() {
//Do nothing
}
public boolean getMyValue() {
return _myValue.get();
}
//the magic should happen here
private void updateValue() {
_executor.execute(() => {
_myValue.set(processValue(_someApi.getValue()));
});
}
//some processing. not that relevant.
private boolean processValue(Values[] values) {
try {
for (...) {... return true;}
} catch (..) { }
return false;
}
}
Сценарий: - на каждомвызывается логин пользователя startedSession
, то есть это может быть 10 пользователей или 100 пользователей, которые звонят одновременно startedSession
.Ключевым моментом здесь является то, что все они вызывают набор на _myValue.Между тем, любой другой может звонить get
.
- , а затем для конкретной обработки:
Опции, которые я вижу:
1) Позволяет потребителю API контролировать размер исполнителя, передавая его через конструктор, как это сделано в примере.
2) СоздатьИсполнитель из класса.Пример:
MyClass() {
_executor = Executors.newFixedThreadPool(10);
}
Вызов обновления на _myValue
, не ожидается много раз или с частыми изменениями для _myValue
, но все же я хочу следовать передовой практике.
Параметры, которые я вижу:
1) Если обновление вызывается и выполняется - отменить все текущие входящие задачи (обновление).Как только он закончится - примите первые входящие и снова отмените следующие, пока ток не будет сделан, и т. Д. ...
2) Поставьте в очередь и не отменяйте, если он выполняется.
Есть предложения, какой подход лучше?Стоит ли так дорого ставить их в очередь или я слишком много копаю?
И еще один последний вопрос: как я могу убедиться, что мой Executor выключен и собран мусор, не закрывая его, пока еще может быть входящее обновлениеЗапросы?
Открыты для любых предложений, советов и других опций.