Java: Как вернуть промежуточные результаты из потока

Используя Java 7, я пытаюсь создать наблюдатель, который наблюдает за хранилищем данных (некоторый тип коллекции), а затем возвращает определенные элементы из него в определенные моменты. В этом случае это метки времени, когда метка времени проходит текущее время, и я хочу, чтобы оно вернулось в начальный поток. Пожалуйста, смотрите код ниже.

@Override
public void run() {
  while (!data.isEmpty()) {
    for (LocalTime dataTime : data) {
      if (new LocalTime().isAfter(dataTime)) {
        // return a result but continue running
      }
    }
  }
}

Я читал о будущем и вызовах, но они, кажется, останавливают поток при возврате.

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

Каковы лучшие методы, чтобы искать это? Там, кажется, такой широкий спектр действий.

Спасибо

2 ответа

Решение

Промежуточные результаты можно поместить в очередь блокировки, чтобы результаты были доступны для потоков потребителей по мере их появления:

private final LinkedBlockingQueue<Result> results = new LinkedBlockingQueue<Result>();

@Override
public void run() {
  while (!data.isEmpty()) {
    for (LocalTime dataTime : data) {
      if (new LocalTime().isAfter(dataTime)) {
        results.put(result);
      }
    }
  }
}

public Result takeResult() {
    return results.take(); 
}

Потребительские темы можно просто назвать takeResult метод использования промежуточных результатов. Преимущество использования очереди блокировки состоит в том, что вам не нужно изобретать велосипед, поскольку это похоже на типичный сценарий "производитель-потребитель", который можно решить с помощью структуры данных блокировки.

Обратите внимание, Result может быть `POJO, который представляет промежуточный объект результата.

Вы на правильном пути. Предполагая, что будет правильная синхронизация, и вы будете получать все свои временные метки вовремя:) В идеале вы должны выбрать структуру данных, которая не требует от вас сканирования всех элементов. Выберите что-то вроде минимальной кучи или нескольких восходящих / нисходящих списков, а теперь, когда вы выполняете итерацию, просто удалите элемент из этого хранилища данных и поместите его в очередь блокировки. есть поток, который прослушивает эту очередь, чтобы продолжить.

Другие вопросы по тегам