【发布时间】:2014-07-31 00:16:39
【问题描述】:
我对以下内容感到困惑。
我知道,如果我使用 ScheduledThreadPoolExecutor 类中的 schedule 方法:
ScheduledFuture<?> scheduledFuture =
scheduledThreadPoolExecutor.schedule(myClassRunnable, 5, TimeUnit.SECONDS);
我以后可以通过 value
scheduledFuture.get(5, TimeUnit.SECONDS) 或 scheduledFuture.get() 应该是 null 因为任务只执行了一次就完成了。
还有null,因为我正在使用Runnable schedule 方法版本而不是Callable schedule 方法版本。符合API。
直到这里我都很好。
我的问题:
如果从scheduleWithFixedDelay(甚至是scheduleAtFixedRate)方法中检索到ScheduledFuture,其用途是什么:
ScheduledFuture<?> scheduledFuture=
scheduledThreadPoolExecutor.scheduleWithFixedDelay(myClassRunnable, 1, 5, TimeUnit.SECONDS);
是的,我知道两个 fixed 方法都会多次执行同一个任务,直到调用 ScheduledThreadPoolExecutor's shutdown 方法(它必须停止所有计划的任务)。
我通过 Google 进行了一项研究,寻找一些使用从 scheduleWithFixedDelay 返回的 ScheduledFuture 的示例,我只找到了一个使用 cancel 方法取消特定任务的示例。但是没有人使用get()。
我不知道我是否错了,但如果我们使用scheduleWithFixedDelay,get() 方法似乎没用,因为如果我稍后使用:
-
scheduledFuture.get()- 它仍在等待,Runnable对象仍然工作多次(运行、完成、延迟、运行等...) -
scheduledFuture.get(32, TimeUnit.SECONDS)- 总是给出TimeoutException
我认为我应该能够检索null 值,因为我可以使用scheduleWithFixedDelay 方法中的period 参数/参数。即:运行Runnable object,等待它完成并使用scheduledFuture.get()获取确认它已经完成的null值,等待延迟时间再次运行Runnable对象根据period值等......
完全欢迎澄清和举例。
【问题讨论】: