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