尽管我使用fixedRate方法而不是简单的时间表,但是这是否能具体确保没有后台活动或垃圾收集会影响我的计时?延迟时间是否足够长,以至于以后的运行会错过我给的整个窗口? (上午8:00至上午8:05)。我已经通过更改操作系统时间来测试执行情况,并且可以正常工作,但这是第一次使用调度和计时逻辑。

    //1 day
static final long timeDelay = 864000000;

public static void main(String[] args) {
    Timer timer = new Timer();
    TimerTask startBegin = new TimerTask() {
        @Override
        public void run() {
            Calendar cal = Calendar.getInstance();
            int month = cal.get(Calendar.MONTH);      // 0 to 11
            int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
            int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
            int hour = cal.get(Calendar.HOUR_OF_DAY);
            int minute = cal.get(Calendar.MINUTE);
            // March, June, Sept, Dec, First Tues at 8 a.m
            if(((month == 2)||(month == 5)||(month == 8)||(month == 11)) && (dayOfMonth <7) && (hour == 8) && (minute >= 0 && minute <5)) {
                begin();
            }
        }
    };
    timer.scheduleAtFixedRate(startBegin, 0, timeDelay);
}

最佳答案

ScheduledExecutorService将尽其所能在指定的时间运行您的程序-但是,这样做会受到先发制人的多线程的各种变化以及所运行的操作系统和硬件的限制,因此受到限制。

有一些用于解决此问题的“实时操作系统”,但是在大多数情况下,标准Java行为将“足够好”。实际误差很小,使用scheduleAtFixedRate时,没有累积误差,等等。

关于java - 延迟会干扰我的时序逻辑吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21531858/

10-13 07:49