为什么我的scheduleAtFixedRate延迟被忽略了?

时间:2016-09-07 20:17:43

标签: java android runnable scheduledexecutorservice

我想每4秒执行一次函数,第一组代码完全可以正常运行"测试"每4秒打印一次。

ScheduledExecutorService SES = Executors.newSingleThreadScheduledExecutor();
            SES.scheduleAtFixedRate(new UpdateGraph(), 4, 4, TimeUnit.SECONDS);

public class UpdateGraph implements Runnable {
    @Override
    public void run() {
        Log.v("testing", "testing");
    }
}

但是,如果我在runnable中有一个for循环,那么"测试"不再像我问的那样延迟。

public class UpdateGraph implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < numberOfFiles; i++) {
            final double t = i;
            final int y = i;
            lineGraphPosture.addNewPoints(PointPosture.singlePoint(t, getNextX().get(y)));
            graphView.repaint();
            Log.v("testing", "testing");
        }
    }
}

我理解问题在于for循环,但未能找出原因?

请某人给一些指导=)

2 个答案:

答案 0 :(得分:0)

使用SchedulorExecutorService时,您必须注意未捕获的异常。如果您的UpdateGraph在运行时抛出异常,则不会再安排执行。

我建议你将这个块包装在try / catch中并记录最终的异常。

答案 1 :(得分:0)

如果您希望Runnable仅执行 numberOfFiles 次,那么这里的错误选择就是计划执行者。而是采用SingleThreadExecutor并执行以下操作:

ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < numberOfFiles; i++) {
    executor.submit(runnable);
    try {
        executor.awaitTermination(4L, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}