Используя поточную обработку Spring и TaskExecutor, как я знаю, когда поток закончен?

  • sizeof () возвращает вам размер указателя, а не количество выделенных байтов. Вам не нужно подсчитывать выделенные байты, просто проверьте, нет ли возвращенного указателя NULL.
  • Строка copy = '\0'; сбрасывает указатель и делает его NULL.
21
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

public List<String> getCommandResults(String command) {
    FutureTask task = new FutureTask(new CommandTask(command))
    taskExecutor.execute(task);

    return task.get(); //or task.get(); return commandResults; - but it not a good practice
}
12
ответ дан 16 October 2019 в 23:39
поделиться

Интерфейс TaskExecutor является интерфейсом «забей и забудь», который используется, когда вам все равно, когда задача завершится. Это самая простая асинхронная абстракция, которую предлагает Spring.

Тем не менее, существует расширенный интерфейс, AsyncTaskExecutor , который предоставляет дополнительные методы, включая submit() методы, которые возвращают Future, что позволяет вам ждать результата.

Spring предоставляет класс ThreadPoolTaskExecutor , который реализует как TaskExecutor, так и AsyncTaskExecutor.

В вашем конкретном случае я бы повторно реализовал Runnable как Callable и возвратил бы commandResults из метода Callable.call(). Затем метод getCommandResults можно переопределить следующим образом:

public List<String> getCommandResults(String command) {
   Future<List<String>> futureResults = taskExecutor.submit(new CommandTask(command));
   return futureResults.get();
}

Этот метод отправит задачу асинхронно, а затем дождется ее завершения, прежде чем вернуть результаты, возвращенные методом Callable.call(). Это также позволяет вам избавиться от поля commandResults.

47
ответ дан skaffman 23 May 2017 в 12:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: