【发布时间】:2017-12-30 23:16:28
【问题描述】:
在下面的代码中scheduleAtFixedRate 无限运行。
所以问题是:
为什么java提供无限线程执行场景?
Runnable task1 = () -> System.out.println("Hello Zoo");
Future<?> result = service1.scheduleAtFixedRate(task1, 8, 2, TimeUnit.SECONDS);
System.out.println(result.get());
System.out.println(result.isDone());
程序从不打印应该为 null 的 result.get() 或应该为 0 的 System.out.println(result.isDone()); 的输出。
所以我的意思是在调用 scheduleAtFixedRate 之后代码应该是无法访问的。
【问题讨论】:
-
“使用 scheduleAtFixedRate 后”是什么意思?您的代码中没有消耗任何内容。
-
@Holger 更新
-
哪个代码应该无法访问?为什么?
-
代码是可达的。当您在
Future上调用get()时,它会等待很长时间,但线程可能会被中断或有人可能会取消Future,因此,代码仍然不会永远被阻塞,只有你谁决定永远不中断线程并且永远不取消未来,但是 Java 怎么能预测你不会这样做呢? -
这与
while(true)或for(;;)无关。无限循环不能被中断或取消,当您编写无限循环时,编译器会将循环后的代码标记为不可达。相反,您问题中的代码 是 可达的。由于您使用它的方式,它只是等待了很长时间。
标签: java concurrency java-8 scheduled-tasks java.util.concurrent