软件开发者、软件实施人员可能经常会接触到定时任务的问题。比如说,数据库定时备份,日志定时压缩,数据定时上传等等。当然,不同的定时任务,实现方式也会不尽相同。有的可能会借助操作系统的定时任务功能。但有些定时任务,就需要软件开发者来编码实现了。本文介绍的是Java如何做定时任务,希望对软件开发人员提供一定的帮助。

前期准备工作(包括相关工具或所使用的原料等)JDK1.8Eclipse 详细的操作方法或具体步骤
首先介绍一种软件开发者经常会用的定时任务实现方式。即利用Thread类的sleep方法来实现定时任务。此方法非常容易理解,通过实现Java线程,然后调用sleep方法,让线程停止一段时候后,再接着执行,已达到实现定时任务的目的。下面是本人编写的测试代码。仅供参考!

代码中呢,就是实现了Runnable接口。run方法中,先打印一个当前系统时间,然后呢,接着执行sleep方法,休眠30秒。从而达到,每隔30秒执行一次打印任务的目的。当然,这个任务可以改为你实际需要执行的任务。比如,执行数据库备份等等。下面,我们将执行以下代码,看一下效果!

上面这种方法呢,是比较基础的实现方法。本身也存在一定弊端。一方面呢,定时任务执行不是很灵活,比如说,你想让他指定一段时候后再执行,不是很好实现。另一方面呢,线程是系统非常宝贵的资源。通过挂起线程来达到实现定时任务的目的,是对系统资源的一种浪费。特别是需要执行的定时任务比较多的时候。这样呢,我们可以提到另一种实现方式。可以利用jdk自带的定时器,Timer来实现。下面是利用Timer实现的一段代码。


上面代码,分别放在两个类中。第一个类为主类,通过Timer来执行TimerTask任务。第二个类为通过实现TimerTask类来编写具体的任务。此中的任务,也是打印了一个系统时间信息。通过Timer来做这个事情的话,可以指定一个延时时间,即可以指定一段时间后执行。并且线程不再被挂起,执行完后释放。下面,可以看一下执行结果。

是否Timer就是非常完美呢?其实,不然。Timer是对系统时间敏感的定时器,若修改时间,就会出现许多问题。不妨,我们做一个测试,先启动Timer,然后将系统时间调快7分钟。看会出现什么情况?我们会发现,定时器同一时间内连续执行了14次任务(7*60/30=14)。若将时间调慢,还会出现定时任务被挂起的情况。系统时间修改会导致定时器某时间段内的失效。

此时,我们可以引入第三种定时任务执行方式了!通过线程池的scheduleAtFixedRate方法来实现。下面就是实现的代码!

此种方法是一种更加好的实现方式。一方面,此种实现方式继承了Timer的灵活性。另一方面,此种方式方式,对系统时间不再敏感,修改系统时间后,它仍然是按照定时时间来执行。下面,我们仍然将系统时间调快7分钟,看一下测试结果。会发现修改系统时间后,对定时任务不再有影响!

- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
