本文目錄一覽:
java 怎麼寫定時任務
如果要執行一些簡單的定時器任務,無須做複雜的控制,也無須保存狀態,那麼可以考慮使用JDK 入門級的定期器Timer來執行重複任務。
一、原理
JDK中,定時器任務的執行需要兩個基本的類:
java.util.Timer;
java.util.TimerTask;
要運行一個定時任務,最基本的步驟如下:
1、建立一個要執行的任務TimerTask。
2、創建一個Timer實例,通過Timer提供的schedule()方法,將 TimerTask加入到定時器Timer中,同時設置執行的規則即可。
當程序執行了Timer初始化代碼後,Timer定時任務就會按照設置去執行。
Timer中的schedule()方法是有多種重載格式的,以適應不同的情況。該方法的格式如下:
void schedule(TimerTask task, Date time)
安排在指定的時間執行指定的任務。
void schedule(TimerTask task, Date firstTime, long period)
安排指定的任務在指定的時間開始進行重複的固定延遲執行。
void schedule(TimerTask task, long delay)
安排在指定延遲後執行指定的任務。
void schedule(TimerTask task, long delay, long period)
安排指定的任務從指定的延遲後開始進行重複的固定延遲執行。
Timer是線程安全的,此類可擴展到大量同時安排的任務(存在數千個都沒有問題)。其所有構造方法都啟動計時器線程。可以調用cancel() 終止此計時器,丟棄所有當前已安排的任務。purge()從此計時器的任務隊列中移除所有已取消的任務。此類不提供實時保證:它使用 Object.wait(long) 方法來安排任務。
TimerTask是一個抽象類,由 Timer 安排為一次執行或重複執行的任務。它有一個抽象方法run()—-計時器任務要執行的操作。因此,每個具體的任務類都必須繼承TimerTask類,並且重寫run()方法。另外它還有兩個非抽象的方法:
boolean cancel()
取消此計時器任務。
long scheduledExecutionTime()
返回此任務最近實際 執行的安排 執行時間。
二、例子
下面用Timer實現一個簡單例子:
package stu.timer;
import java.util.Date;
import java.util.TimerTask;
/**
* 重複執行的任務
*
* @author leizhimin,2008-10-9 9:20:20
*/
public class TestTimerTask extends TimerTask {
/**
* 此計時器任務要執行的操作。
*/
public void run() {
Date executeTime = new Date(this.scheduledExecutionTime());
System.out.println(“本次任務執行的時間是” + executeTime);
}
}
package stu.timer;
import java.util.Timer;
import java.util.TimerTask;
/**
* 測試JDK Timer的執行
*
* @author leizhimin,2008-10-9 9:24:35
*/
public class TestTimer {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask task = new TestTimerTask();
timer.schedule(task, 500L, 1000L);
}
}
運行結果:
本次任務執行的時間是Thu Oct 09 09:47:57 CST 2008
本次任務執行的時間是Thu Oct 09 09:47:58 CST 2008
本次任務執行的時間是Thu Oct 09 09:47:59 CST 2008
本次任務執行的時間是Thu Oct 09 09:48:00 CST 2008
本次任務執行的時間是Thu Oct 09 09:48:01 CST 2008
本次任務執行的時間是Thu Oct 09 09:48:02 CST 2008
本次任務執行的時間是Thu Oct 09 09:48:03 CST 2008
本次任務執行的時間是Thu Oct 09 09:48:04 CST 2008
本次任務執行的時間是Thu Oct 09 09:48:05 CST 2008
……
JAVA實現定時任務的幾種方式
Java 基本的定時任務,總結方法有三種:
1 創建一個thread,然後讓它在while循環里一直運行着,通過sleep方法來達到定時任務的效果;
2 用Timer和TimerTask與第一種方法相比有如下好處:
當啟動和去取消任務時可以控制
第一次執行任務時可以指定你想要的delay時間
3 用ScheduledExecutorService是從的java.util.concurrent里,做為並發工具類被引進的,這是最理想的定時任務實現方式,相比於上兩個方法,它有以下好處:
相比於Timer的單線程,它是通過線程池的方式來執行任務的
可以很靈活的去設定第一次執行任務delay時間
提供了良好的約定,以便設定執行的時間間隔
java的幾種定時任務
java定時任務有三種:
– JDK自帶 :JDK自帶的Timer以及JDK1.5+ 新增的ScheduledExecutorService;
– Quartz :簡單卻強大的JAVA作業調度框架
– Spring3.0以後自帶的task :可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多;
代碼參考:
JDK 自帶的定時器實現
schedule(TimerTask task, Date time) 特定時間執行
public static void main(String[] args) {
for (int i = 0; i 10; ++i) {
new Timer(“timer – ” + i).schedule(new TimerTask() {
@Override
public void run() {
println(Thread.currentThread().getName() + ” run “);
}
}, new Date(System.currentTimeMillis() + 2000));
}
}
Quartz 定時器實現
2.1 通過maven引入依賴(這裡主要介紹2.3.0) 注意:shiro-scheduler中依賴的是1.x版本 如果同時使用會衝突
!– —
dependency
groupIdorg.quartz-scheduler/groupId
artifactIdquartz/artifactId
version2.3.0/version
/dependency
2.2 創建Job類
public class TestJob implements Job{
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
println(Thread.currentThread().getName() + ” test job begin ” + DateUtil.getCurrentTimeStr());
}
}
2.3 調度任務
public static void main(String[] args) throws InterruptedException, SchedulerException {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
// 開始
scheduler.start();
// job 唯一標識 test.test-1
JobKey jobKey = new JobKey(“test” , “test-1”);
JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build();
Trigger trigger = TriggerBuilder.newTrigger() .withIdentity(“test” , “test”)
// 延遲一秒執行
.startAt(new Date(System.currentTimeMillis() + 1000))
// 每隔一秒執行 並一直重複
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build();
scheduler.scheduleJob(jobDetail , trigger);
Thread.sleep(5000);
// 刪除job
scheduler.deleteJob(jobKey);
}
3.Spring 相關的任務調度
3.1 配置文件實現
spring-schedule.xml
task:scheduler id=”myScheduler” pool-size=”10″ /
task:scheduled-tasks scheduler=”myScheduler”
task:scheduled ref=”job” method=”test” cron=”0 * * * * ?”/
/task:scheduled-tasks
3.2註解實現
spring-schedule.xml
task:scheduler id=”myScheduler” pool-size=”10″ /
// 啟用註解
task:annotation-driven scheduler=”myScheduler”/
@Component
public class Task{
@Scheduled(cron=”0/5 * * * * ? “) //每5秒執行一次
public void execute(){
DateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
System.out.println(sdf.format(DateTime.now().toDate())+”*********B任務每5秒執行一次進入測試”);
}
}
java定時任務沒有執行完又到執行時間了
代碼錯誤。多數是代碼錯誤導致java定時任務沒有執行完又到執行時間了。
1、首先打開java檢查代碼是否錯誤。
2、其次打開網絡診斷器進行測試網絡連接是否異常。
3、最後點擊重新運行java即可。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/231740.html