Подход к написанию ExecutorService для обновления значения AtomicBoolean - PullRequest
0 голосов
/ 25 ноября 2018

Я задаю этот вопрос, специфичный для данного варианта использования, в отношении того, что является наилучшим и наиболее экономичным и элегантным способом достижения следующего:

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 выключен и собран мусор, не закрывая его, пока еще может быть входящее обновлениеЗапросы?

Открыты для любых предложений, советов и других опций.

...