是的,不需要任何框架,我们可以用我们简单的Java编程语言实现定时任务。今天栈长给大家介绍3种实现方式,教大家如何使用JDK实现定时任务!1.睡眠这也是我们最常用的睡眠方式。它不仅仅用于睡眠,我们还可以用它来轻松实现一个简单的定时任务。实现逻辑:新开一个线程,加入for/while无限循环,然后在无限循环中加入sleep休眠逻辑,让程序每隔N秒休眠再执行一次,从而达到简单定时任务的效果。实现代码如下:/**sleep实现定时任务源公众号:Java技术栈*/privatestaticvoidsleepTask(){newThread(()->{while(true){System.out.println("hi,Welcomeattention:Javatechnologystack");try{//每3秒执行一次Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}}}).start();}This这个方法比较笨,只能以固定的频率运行,不能指定具体的运行时间。另外,上面的箭头语法,stackleader在JDK8中使用了Lambda表达式,这里就不写了。写了一堆Java8系列的实用教程。不清楚的可以关注公众号:Java技术栈,后台回复“java”即可阅读,我都整理好了。2.定时器看JDK自带的java.util.Timer类:JDK1.3内置了java.util.Timer类,可以用来调度java.util.TimerTask任务。几个重要的方法:schedule:开始调度任务,提供几种打包方法;cancle:终止任务调度,取消所有当前调度的任务,正在运行的任务不受影响;purge:从任务队列中移除所有计划任务中已取消的任务;另外,java.util.TimerTask实现了Runnable接口,具体的任务逻辑在run方法中实现。实现代码如下:/**timer定时任务来源公众号:Java技术栈*/privatestaticvoidtimerTask()throwsInterruptedException{Timertimer=newTimer();TimerTasktimerTask=newTimerTask(){@Overridepublicvoidrun(){System.out.println("您好,欢迎关注:Java技术栈");}};//第一个任务的延迟时间longdelay=2000;//任务执行频率longperiod=3*1000;//开始调度timer.schedule(timerTask,delay,period);//指定第一个运行时间//timer.schedule(timerTask,DateUtils.addSeconds(newDate(),5),period);Thread.sleep(20000);//终止并移除任务timer.cancel();timer.purge();}这个实现方法比较简单,可以指定第一次执行的延迟时间,第一次执行的具体日期和时间,以及执行频率,可以满足日常需求。另外需要注意的是,Timer是线程安全的,因为它后面的所有任务都在一个线程中执行。Timer也有一些缺陷:Timer是单线程的。如果有任务A、B、C,如果任务A的执行时间比较长,会影响任务B和C的启动和执行时间,如果B和C的执行时间也比较长,所以会互相影响;定时器不会捕获异常。如果A、B、C任一个任务在执行过程中出现异常,都会导致整个TImer的定时任务停止工作;定时器是基于绝对时间调度的。不基于相对时间,因此对系统时间变化非常敏感;所以,如果在使用Timer的过程中注意了这些缺陷,虽然可以使用,但不推荐使用。3、ScheduledExecutorService在Timer中存在一些缺陷,不推荐使用Timer。推荐使用ScheduledExecutorService:ScheduledExecutorService是Timer的替代品。JDK1.5并发包介绍是一个基于线程池设计的定时任务类:java.util.concurrent。Executors.newScheduledThreadPool连接线程池,每个定时任务都会分配给线程池中的某个线程执行。任务并发调度执行,任务之间互不影响。几种重要的调度方式:schedule:只调度一次;scheduleAtFixedRate:固定频率调度,如果执行时间过长,下一次调度会延迟,不会同时执行;scheduleWithFixedDelay:延迟调度,在最后一次执行后,添加一个延迟后执行;另外可以看出任务支持Runnable和Callable调度。实现代码如下:/**线程池定时任务来源公众号:Java技术栈*/publicstaticvoidpoolTask??(){ScheduledExecutorServicepool=Executors.newScheduledThreadPool(10);pool.scheduleAtFixedRate(()->{System.out.println("hi,欢迎关注:Java技术栈");},2000,3000,TimeUnit.MILLISECONDS);}这是一个固定频率调度的任务,创建10个核心线程,第一次执行延时就是2秒,然后每3秒执行一次。这种方法简单易用,避免了使用Timer带来的各种问题。推荐使用这种实现方式。综上所述,本文栈长分享了Java实现定时任务的3种方式,比较简单,但是执行频率和时间设置过于简单,只适合简单的业务,不适合实际复杂的业务需求,实际业务需要考虑的分布模式、failoverrecovery等要复杂的多。最后,如果您觉得这篇文章对您有点帮助,请点个赞。或者可以加入我的开发交流群:1025263163互相学习,我们会有专业的技术解答。如果您觉得这篇文章对您有用,请给我们的开源项目一个小星星:https://gitee。com/ZhongBangKe...非常感谢!JAVA学习手册:https://doc.crmeb.com技术交流论坛:https://q.crmeb.com
