java 实现定时任务的三种方法是什么,java 实现定时任务的三种方法有哪些,Java 实现定时任务的三种方法

java 实现定时任务的三种方法是什么,java 实现定时任务的三种方法有哪些,Java 实现定时任务的三种方法

本文主要介绍在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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: