2

你能帮助我吗?我实现了一个执行器和scheduledWithFixedDelay,但它只执行一次......而且我想以重复的方式完成这项任务......

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
    executor.scheduleWithFixedDelay(new Runnable(){

        public void run() {
            updateList();
        }

    }, updateTime, updateTime, TimeUnit.MINUTES);

我究竟做错了什么?

提前致谢。

4

1 回答 1

0

看起来你正在以正确的方式做这件事。这让我阅读了 java 文档,这就是我发现的让我自己感到惊讶的东西。

如果任务的任何执行遇到异常,则后续执行将被抑制。

ScheduledExecutorService.scheduleWithFixedDelay()

runnable中的代码是否有可能产生异常,从而导致Scheduled Executor终止执行?你肯定会提到这一点吗?

但正如我所说,我发现这令人惊讶,因为我认为 Scheduled Executor 处理异常,因此不会抑制后续任务执行。这是首选而不是经典Timer的主要原因之一。但现在我在 javadoc 中看到我显然认为错了......

我对 Android 平台不是很熟悉,但 Oracle 的 JVM 和 Android 的 Dalvik 之间的 java.util.concurrent 设施可能存在差异,因此考虑到 Oracle 的 JVM javadocs 可能不是一个好主意。

编辑:确实工厂方法的javadoc说

(但是请注意,如果这个单线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,一个新线程将取代它。)

Executors.newSingleThreadScheduledExecutor()

EDIT2:Oracle 和 Dalvik 的 java doc 似乎几乎无法区分。

于 2012-04-08T12:09:53.623 回答