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