ScheduledExecutorService scheduleWithFixedDelay для вызываемого объекта

#java #multithreading #concurrency #java.util.concurrent

#java #многопоточность #параллелизм #java.util.concurrent

Вопрос:

Я пытаюсь выполнить периодическое действие, используя пакет параллелизма Java, и я использую следующий код:

 ScheduledExecutorService daemon = Executors.newScheduledThreadPool(1);
daemon.scheduleWithFixedDelay(new AddressThread(ParentMap.getSingletonInstance(), dictionary, test),10, 10, TimeUnit.SECONDS);
  

где AddressThread это Runnable передаваемый тип. Код выполняется run() каждые 10 секунд, и он работает так, как я ожидаю. Однако мне нужно вернуть значение, а run() это не позволяет мне этого сделать. Существует ли аналогичный метод, такой как scheduleWithFixedDelay, где я могу передать Callable интерфейс, а не Runnable и вернуть что-то обратно? Если нет, то как я могу выполнить аналогичные действия, подобные приведенным выше, если я хочу вернуть значение?

Комментарии:

1. scheduleWithFixedDelay принимает в качестве аргумента только Runnable, но не вызываемый. Из-за этого возвращаемый тип ScheduledFuture равен null. Только метод schedule принимает как выполняемый, так и вызываемый. Для вашего случая, я думаю, имеет смысл использовать это. И последнее, но не менее важное: поскольку вы используете один поток в пуле, почему бы не использовать .newSingleThreadScheduledExecutor() вместо newScheduledThreadPool(1) ?

Ответ №1:

Проблема в том, где вы хотите обработать результат. Если ваша задача будет выполнена один раз, вы получите результат задачи из возвращаемого ScheduledFuture (смотрите Здесь: здесь)

Когда выполняется несколько вызовов, никто не может определить, доступно ли возвращаемое значение.

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