本文目錄一覽:
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程序員每天要做的主要有:需求分析、框架選型、編碼、測試、改bug等。
1、需求分析
在接到開發任務時,java程序員首先要對這個任務進行需求分析,了解時間節點、任務目標、需要什麼元素等等,梳理好工作流程之後再開始進行開發工作。
2、框架選擇
在開始編程之前還需要先調研有哪些工具或者框架可以來做這個事,分別有哪些優缺點,針對自己的項目,哪個比較合適一些,甚至可以寫個demo來試看看是否有什麼問題。
3、編碼
準備工作都做好後就要開始編程開發了,java程序員每天大部分時間都被用來編程。
4、測試並改bug
程序編寫好後需要程序員做初步的測試看看程序能不能跑起來同時生產程序在跑的過程中,可能會出現各種各樣的異常,如果有問題需要程序員及時查看日誌,查問題,解決問題。
java每天只能執行一個任務
一、用java.util.Timer
使用JAVA類Timer可實現簡單的延遲和周期性任務,其中的任務使用java.util.TimerTask表示。任務的執行方式有兩種:
按固定速率執行:即scheduleAtFixedRate的兩個重載方法
Timer timer = newTimer();
timer. scheduleAtFixedRate(newTimerTask() {
@Overridepublic voidrun() {
System.out.println(“Timer is running”);
}
},2000, 5000);
按固定延遲執行:即schedule的4個重載方法
Timer timer = newTimer();
timer.schedule(newTimerTask() {
@Overridepublic voidrun() {
System.out.println(“Timer is running”);
}
},2000);
我們要實現一個定時任務,只需要實現TimerTask的run方法即可。每一個任務都有下一次執行時間nextExecutionTime(毫秒),如果是周期性的任務,那麼每次執行都會更新這個時間為下一次的執行時間,當nextExecutionTime小於當前時間時,都會執行它。
Timer的缺陷
1、由於執行任務的線程只有一個,所以如果某個任務的執行時間過長,那麼將破壞其他任務的定時精確性。如一個任務每1秒執行一次,而另一個任務執行一次需要5秒,那麼如果是固定速率的任務,那麼會在5秒這個任務執行完成後連續執行5次,而固定延遲的任務將丟失4次執行。
2、如果執行某個任務過程中拋出了異常,那麼執行線程將會終止,導致Timer中的其他任務也不能再執行。
3、Timer使用的是絕對時間,即是某個時間點,所以它執行依賴系統的時間,如果系統時間修改了的話,將導致任務可能不會被執行。
二、使用ScheduledThreadPoolExecutor
由於Timer存在上面說的這些缺陷,在JDK1.5中,我們可以使用ScheduledThreadPoolExecutor來代替它,使用Executors.newScheduledThreadPool工廠方法或使用ScheduledThreadPoolExecutor的構造函數來創建定時任務,它是基於線程池的實現,不會存在Timer存在的上述問題,當線程數量為1時,它相當於Timer。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(newRunnable() {public voidrun() {
System.out.println(“delay 3 seconds”);
}
},3, TimeUnit.SECONDS);
scheduledThreadPool.scheduleAtFixedRate(()-System.out.println(“delay 1 seconds, and excute every 3 seconds”)
,1, 3, TimeUnit.SECONDS);
java定時任務沒有執行完又到執行時間了
代碼錯誤。多數是代碼錯誤導致java定時任務沒有執行完又到執行時間了。
1、首先打開java檢查代碼是否錯誤。
2、其次打開網路診斷器進行測試網路連接是否異常。
3、最後點擊重新運行java即可。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/306195.html