本文主要介绍在Java中实现定时任务的三种方法,可以帮助你更好的理解和学习使用Java。感兴趣的朋友可以了解一下。
目录
1、睡眠
2、定时器
3、调度执行服务
摘要
是的,不需要任何框架,用我们简单的Java编程语言就可以实现定时任务。
今天,堆栈管理器将介绍三种实现方法,并教你如何使用JDK来实现预定的任务!
1、睡眠
这也是我们最常用的睡眠解决方案。它不仅用作睡眠解决方案,我们还可以通过使用它轻松实现简单的定时任务。
实现逻辑:
启动一个新线程,加入一个for/while无限循环,然后在无限循环中加入一个睡眠逻辑,让程序每隔N秒睡眠一次,再次执行,从而达到一个简单的定时任务的效果。
实现代码如下:
私有静态void sleepTask() {
新线程(()- {
while (true) {
System.out.println('嗨,欢迎关注:Java技术栈');
尝试{
//每3秒执行一次
thread . sleep(3000);
} catch (InterruptedException e) {
e . printstacktrace();
}
}
}).start();
}
这种方法很傻,只能固定频率运行,不能指定具体运行时间。
另外,上面的箭头语法中,堆栈管理器使用了JDK 8中的Lambda表达式,这里就不写了。我写过一堆java 8系列的实战教程。不知道的可以关注微信官方账号:Java技术栈,后台回复' Java '阅读。我都整理好了。
2、定时器
看看JDK附带的java.util.Timer类:
JDK 1.3内置了java.util.Timer类,可用于调度java.util.TimerTask任务。
几个重要的方法:
调度:开始调度任务,提供几种打包方式;
CLE:终止任务调度,可以取消所有当前调度的任务,正在运行的任务不受影响;
清除:从任务队列中删除所有已取消的任务;
另外,java.util.TimerTask实现了runnable接口,具体的任务逻辑在Run方法中实现。
实现代码如下:
私有静态void timerTask()引发InterruptedException {
Timer Timer=new Timer();
TimerTask TimerTask=new TimerTask(){
@覆盖
公共无效运行(){
System.out.println('嗨,欢迎关注:Java技术栈');
}
};
//第一个任务的延迟时间
长延时=2000;
//任务执行频率
长周期=3 * 1000;
//开始调度
timer.schedule(timerTask,delay,period);
//指定首次运行时间
//timer.schedule(timerTask,DateUtils.addSeconds(new Date(),5),period);
线程.睡眠(20000);
//终止并删除任务
timer . cancel();
timer . purge();
}
这个实现很简单,可以指定第一次执行的延迟时间,第一次执行的具体日期和时间,以及执行频率,可以满足日常需要。
另外,需要注意的是,Timer是线程安全的,因为它后面有一个单独的线程来执行所有的任务。
计时器也有一些缺点:
定时器是单线程的。如果有任务A、B、C,如果任务A执行时间长,就会影响任务B、C的启动和执行时间,如果任务B、C执行时间长,就会相互影响。
计时器不会捕捉异常。如果任务A、B、C中的任何一个在执行过程中出现异常,都会导致定时器的整个调度任务停止工作。
定时器是基于绝对时间调度的,而不是相对时间,所以对系统时间的变化非常敏感。
所以,如果在使用Timer的过程中要注意这些缺陷,虽然可以使用,但不建议使用。
3、调度执行服务
因为Timer有一些缺陷,所以不建议使用Timer。建议使用ScheduledExecutorService:
ScheduledExecutorService是Timer的替代,JDK 1.5是通过收缩引入的,是基于线程池设计的调度任务类:
Java . util . concurrent . executors . newscheduledthreadpool
在线程池中,每个调度的任务将被分配给线程池中的一个线程来执行。任务是并行调度和执行的,任务之间互不影响。
几种重要的调度方法:
Schedule: schedule只执行一次;
ScheduleAtFixedRate:以固定频率调度;如果执行时间过长,下一个调度会延迟,不会同时执行;
ScheduleWithFixedDelay:延迟调度,在最后一次执行加上延迟时间后执行;
另外,可以看出任务支持可运行和可调用的调度。
实现代码如下:
公共静态void poolTask(){
ScheduledExecutorService pool=executors . newscheduledthreadpool(10);
pool.scheduleAtFixedRate(() - {
System.out.println('嗨,欢迎关注:Java技术栈');
},2000,3000,时间单位。毫秒);
}
这是一项以固定频率计划的任务。创建十个核心线程,第一次执行延迟2秒,后续执行每3秒一次。
这种方法简单易用,避免了使用定时器带来的各种问题。建议使用这种实现方法。
摘要
好了,本文的栈管理器分享了三种在Java中实现定时任务的方法,比较简单,但是执行频率和时间的设置过于简单,只适合简单的业务,不适合实际复杂业务的需要。在实际业务中,考虑分布式、故障转移和恢复要复杂得多。
本文只给你一个参考。它可以在没有框架的情况下实现定时任务,在小而美的场景下依然很香。
最后,Java系列教程会继续更新。关注技术栈和微信官方账号的Java首推,也可以从微信官方账号菜单获取历史Java教程,都是干货。
本教程所有实战源码都上传到这个仓库了:
https://github.com/javastacks/javastack
最后,如果我觉得我的文章对你有用,就用你的小手,送给正在阅读转发的人。原创不易,栈长需要你的鼓励。
以上是Java实现定时任务的三种方法的详细说明。更多关于Java实现定时任务的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。