Поскольку вы как бы злоупотребляете FutureTask
.
FutureTask - это «отменяемое асинхронное вычисление» в соответствии с Javadocs, но в более разговорной форме оно оборачивает конкретное выполнение Runnable / Callable для обеспечения асинхронности,На самом деле я не осознавал, что он реализовал Runnable
, пока не проверил только сейчас - реализация run()
"устанавливает это Будущее в результате его вычисления".
Итак, что происходит в вашем первом примере:что вы планируете будущую задачу, ее метод run вызывается через 1 секунду, и поэтому он вычисляет результат вычисления (т. е. запускает встроенный Runnable
).Когда этот метод завершается, FutureTask уже запущен и имеет конкретный результат - поэтому будущие вызовы run () не являются операциями.
Я думаю, что основная проблема здесь заключается в том, что это, кажется, не имеет смыслапланировать FutureTask напрямую, по крайней мере, не так, как вы делаете здесь.Если вы хотите, чтобы часть кода запускалась каждые пять секунд, тогда вам определенно следует воспользоваться вторым подходом.FutureTask воплощает (одиночный!) Расчет;нет никаких причин, по которым вы хотели бы, чтобы он вызывался несколько раз, и фактически он специально кэширует результат, чтобы предотвратить это.