为什么80%的码农都做不了架构师?>>>
在工作中,我们总能经常碰到定时任务,数据的定时同步,消息的定时发送等等,这都和定时器的使用有关。java中,常用的定时器都是使用Timer类或者通过线程,使用ScheduledExecutorService类来使用,代码如下:
public class Main {public static void main(String[] args) {
// timer1();
// timer2();
// timer3();
// timer4();//第五种方式:java.util.concurrent.ScheduledExecutorService 来实现定时任务//延时3秒,并且每隔3秒执行一次,其中TimeUnit控制前面两个参数的数值,现在用的是SECONDS秒,也可以HOURS小时Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("varuscn");}};ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();service.scheduleAtFixedRate(runnable, 3, 3, TimeUnit.SECONDS);}//延时3秒执行且仅执行一次public static void timer1(){Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("varuscn");}}, 3000);}//延时3秒执行,并且每隔三秒执行一次public static void timer2(){Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("varuscn");}}, 3000, 3000);}//延时3秒执行,并且每隔三秒执行一次,使用scheduleAtFixedRatepublic static void timer3(){Timer timer = new Timer();timer.scheduleAtFixedRate(new TimerTask() {@Overridepublic void run() {System.out.println("varuscn");}}, 3000, 3000);}//每天中午12点执行一次public static void timer4(){Calendar calendar = Calendar.getInstance();
// calendar.set(Calendar.DAY_OF_WEEK, 2);calendar.set(Calendar.HOUR_OF_DAY, 18);calendar.set(Calendar.MINUTE, 20);calendar.set(Calendar.SECOND, 0);Date date = calendar.getTime();//得出执行任务的时间,24小时制,这里表示的是中午12点Timer timer = new Timer();timer.scheduleAtFixedRate(new TimerTask() {@Overridepublic void run() {System.out.println("varuscn");}},date, 24*60*60*1000);}
}
上面说了这么多种方法,他们之间都有些什么区别呢?
首先说一下Schedule和ScheduleAtFixedRate的区别:
1. schedule() ,2个参数(timer1())方法:
在执行任务时,如果指定的计划执行时间scheduledExecutionTime <= systemCurrentTime(系统当前时间),则task会被立即执行。
2. schedule() ,3个参数方法(timer2()):
在执行任务时,如果指定的计划执行时间scheduledExecutionTime <= systemCurrentTime,则task会被立即执行,之后按period参数固定重复执行。
3. scheduleAtFixedRate() ,3个参数方法:
在执行任务时,如果指定的计划执行时间scheduledExecutionTime<= systemCurrentTime,则task会首先执行一次;然后按照执行时间、系统当前时间和period参数计算出过期该执行的次数,计算按照: (systemCurrentTime-scheduledExecutionTime)/period,再次执行计算出的次数;最后按period参数固定重复执行。以timer4()方法为例,如果将date这个参数的值设置为前天中午10点,比如现在今天的时间是上午10点,那么程序执行之后,会立即执行两次,时间分别是前天中午12点,昨天中午12点,再过两个小时又会执行一次,之后每隔一天的时间执行一次。
4. schedule() 和scheduleAtFixedRate()
schedule()方法更注重保持间隔时间的稳定。
scheduleAtFixedRate()方法更注重保持执行频率的稳定。
5.再说ScheduledExecutorService和Timer的区别
提供一篇博客,写的很详细了,笔者不再赘述:https://www.cnblogs.com/xgjblog/p/4224808.html
至此,java中定时器就说完了,当然有兴趣的读者还可以继续深入研究。
欢迎加入java交流群:280097991。