如果从scheduleWithFixedDelay/scheduleAtFixedRate方法检索ScheduledFuture.get()方法的目的是什么

Man*_*dan 14 java java.util.concurrent

我对以下内容感到困惑

我知道,如果我使用该类中的schedule方法ScheduledThreadPoolExecutor:

ScheduledFuture<?> scheduledFuture = 
scheduledThreadPoolExecutor.schedule(myClassRunnable, 5, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

我能够通过或稍后检索, 并且应该为null,因为该任务只执行了一次并且已完成.并且null因为我正在使用方法版本而不是方法版本.它符合APIscheduledFuture.get(5, TimeUnit.SECONDS)scheduledFuture.get()shedule's Runnableshedule's Callable

直到这里我很好.

我的问题:

ScheduledFuturescheduleWithFixedDelay(甚至来自scheduleAtFixedRate)方法中检索if 的目的是什么:

ScheduledFuture<?> scheduledFuture= 
scheduledThreadPoolExecutor.scheduleWithFixedDelay(myClassRunnable, 1, 5, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

是的,我知道两种固定方法多次执行相同的任务,直到ScheduledThreadPoolExecutor's shutdown调用该方法(它必须停止所有已安排的任务).

我做了一项研究,通过谷歌寻找一些使用ScheduledFuture返回的例子scheduleWithFixedDelay,我只找到一个使用cancel方法,取消一个特定的任务.但没有人与get合作.

我不知道我是不是错了,但如果我们正在使用,似乎没有get方法scheduleWithFixedDelay,因为如果我以后使用:

  • scheduledFuture.get() - 它仍在等待,Runnable对象保持工作多次(运行,完成,延迟,运行等......)
  • scheduledFuture.get(32,TimeUnit.SECONDS) - 总是出现TimeoutException

我以为我应该能够检索空值,因为我可以使用方法中的period参数/参数scheduleWithFixedDelay.我的意思是:运行Runnable对象,等待它完成并使用scheduledFuture.get()获取确认它已完成的空值,等待延迟时间的周期再次运行Runnable对象根据period值等....

澄清和例子非常受欢迎

提前致谢.

Evg*_*eev 8

ScheduledFuture 可用于获取下一个任务执行前的剩余时间:

    ScheduledFuture<?> f = Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
        public void run() {
            System.out.println("run");
        }
    }, 0, 10000, TimeUnit.MILLISECONDS);
    Thread.sleep(1000);
    System.out.println("Time left before next run " + f.getDelay(TimeUnit.MILLISECONDS));
Run Code Online (Sandbox Code Playgroud)

印刷

run
Time left before next run 8999
Run Code Online (Sandbox Code Playgroud)

  • 并没有真正回答 OP 问题“ScheduledFuture.get() 方法的目的是什么” (20认同)