java se 定时任务_Java实现定时任务的三种方法
一、Quartz的特點 按作業類的繼承方式來分,主要有以下兩種: 作業類繼承org.springframework.scheduling.quartz.QuartzJobBean類的方式作業類不繼承org.springframework.scheduling.quartz.QuartzJobBean類的方式 注:個人比較推崇第二種,因為這種方式下的
在應用里經常都有用到在后臺跑定時任務的需求。舉個例子,比如需要在服務后臺跑一個定時任務來進行非實時計算,清除臨時數據、文件等。在本文里,我會給大家介紹3種不同的實現方法: 普通thread實現 TimerTask實現 ScheduledExecutorService實現 普通thread 這是最常見的,創建一個thread,然后讓它在while循環里一直運行著,通過sleep方法來達到定時任務的效果。這樣可以快速簡單的實現,代碼如下: package com.vmware.task;import java.util.Date;import java.util.List;import java.util.Map;import com.vmware.dao.TemplateDao;import com.vmware.pojo.Template;import com.vmware.util.TimeUtil;public class TemplateVMTask implements Runnable
{
@Override
public void run() {
while(true){
long starttime=new Date().getTime();//開始時間
String sql="SELECT * from tb_flw_content where type_id='1' or type_id='4'
and `status`='2'";
TemplateDao dao=new TemplateDao();
List list=dao.getTemplate(sql);
VirtualMachineTemplate template=new VirtualMachineTemplate();
template.tempalteToVm(list);
long endtime=new Date().getTime();//結束時間
long usetime=endtime-starttime;//使用時間
try{
//讀取配置文件
TimeUtil util=new TimeUtil();
Map map=util.getURL();
long time=Long.parseLong(String.valueOf(map.get("time")))*1000;//配置時間
if(time-usetime>0){
Thread.sleep(time-usetime);//休眠時間
}
}catch(Exception e){
e.printStackTrace();
}
}
}}在main 方法中,啟動該線程 package com.vmware.test;import com.vmware.task.TemplateVMTask;public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TemplateVMTask task=new TemplateVMTask();
Thread thread=new Thread(task);
thread.start();
}} 用Timer和TimerTask 上面的實現是非??煊萌N方法來實現n!實現使用BigDecimal類,因為用int最多正確算到12!,用long最多正確算到20!.實現方法都比較簡單,但是轉換為BigDecimal實現后可能看起來有點莫名其妙。廢話不多說,直接上代碼:
第一種方法:從1開始,一直遞增乘到n,從而實現n!
Java代碼速簡便的,但它也缺少一些功能。 用Timer和TimerTask的話與上述方法相比有如下好處: 當啟動和去取消任務時可以控制 第一次執行任務時可以指定你想要的delay時間 在實現時,Timer類可以調度任務,TimerTask則是通過在run()方法里實現具體任務。 Timer實例可以調度多任務,它是線程安全的。 當Timer的構造器被調用時,它創建了一個線程,這個線程可以用來調度任務: import java.util.Timer;import java.util.TimerTask;public class Task2 {
public static void main(String[] args) {
TimerTask task = new TimerTask() {
@Override
public void run() {
// task to run goes here
System.out.println("Hello !!!");
}
};
Timer timer = new Timer();
long delay = 0;
long intevalPeriod = 1 * 1000;
// schedules the task to be run in an interval
timer.scheduleAtFixedRate(task, delay,
intevalPeriod);
} // end of main} ScheduledExecutorService ScheduledExecutorService是從Java SE 5的java.util.concurrent里,做為并發工具類被引進的,這是最理想的定時任務實現方式。 相比于上兩個方法,它有以下好處:
相比于Timer的單線程,它是通過線程池的方式來執行任務的
可以很靈活的去設定第一次執行任務delay時間
提供了良好的約定,以便設定執行的時間間隔
我們通過ScheduledExecutorService#scheduleAtFixedRate展示這個例子,通過代碼里參數的控制,首次執行加了delay時間: import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Task3 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
public void run() {
// task to run goes here
System.out.println("Hello !!");
}
};
ScheduledExecutorService service = Executors
.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
}}
總結
以上是生活随笔為你收集整理的java se 定时任务_Java实现定时任务的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java连接微软ad_Java:连接到A
- 下一篇: java 80_【JavaWeb】80: