NULL
. copy = '\0'
; сбрасывает указатель и делает его NULL
. 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
}
Интерфейс 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
.