jdk 1.8 之 java.util.Timer 试用

    技术2023-09-28  76

    1, 试用代码

    package com.dosrain.shunc.trial.schedule; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerTest { public static void main(String[] args) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Timer timer = new Timer(); TimerTask timerTask1 = new TimerTask() { @Override public void run() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(Thread.currentThread().getName() + " " + sdf.format(new Date()) + ": task-1 start"); /* try { Thread.sleep(1000*10); } catch (InterruptedException e) { e.printStackTrace(); } */ System.out.println(Thread.currentThread().getName() + " " + sdf.format(new Date()) + ": task-1 end"); } }; TimerTask timerTask2 = new TimerTask() { @Override public void run() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(Thread.currentThread().getName() + " " + sdf.format(new Date()) + ": task-2"); } }; timer.scheduleAtFixedRate(timerTask1, sdf.parse("2020-07-03 15:35:00"), 1000*3); timer.schedule(timerTask1, sdf.parse("2020-07-03 15:35:00"), 1000*5); } }

    2, 理解区别

    timer.scheduleAtFixedRate(timerTask1, sdf.parse("2020-07-03 15:35:00"), 1000*5);timer.schedule(timerTask1, sdf.parse("2020-07-03 15:35:00"), 1000*5);

    第1行代码,scheduleAtFixedRate,表示到达指定时间后马上执行,然后每间隔5秒,重复执行一次。

    第2行代码,schedule,表示到达指定时间后马上执行,然后每间隔5秒,重复执行一次。

    两者的区别在于,

    scheduleAtFixedRate 中,指定的时间在当前时间之前的话,会计算当前时间与指定时间的时间差,再除以间隔时间,得出要补算的次数,然后立即执行补算,且每次补算之间,不再停顿指定的间隔时间。

    schedule 中,指定的时间在当前时间之前的话,会执行一次,然后等待间隔时间到后,再重复执行,不会补算。

    Processed: 0.025, SQL: 9