導航:首頁 > 編程語言 > java實現定時任務的三種方法

java實現定時任務的三種方法

發布時間:2023-07-30 11:48:22

『壹』 java定時執行一個方法

java中設置定時任務用類可以實現。
一、延時執行
首先,我們定義一個類,給它取個名字叫TimeTask,我們的定時任務,就在這個類的main函數里執行。代碼如下:
package test;
import java.util.Timer;
public class TimeTask {
public static void main(String[] args){
Timer timer = new Timer();
timer.schele(new Task(), 60 * 1000);
}
}
解釋一下上面的代碼。
上面的代碼實現了這樣一個功能,當TimeTask程序啟動以後,過一分鍾後執行某項任務。很簡單吧:先new一個Timer對象,然後調用它的schele方法,這個方法有四個重載的方法,這里我們用其中一個,
public void schele(TimerTask task,long delay)
首先,第一個參數
第一個參數就是我們要執行的任務。
這是一個TimerTask對象,確切點說是一個實現TimerTask的類的對象,因為TimerTask是個抽象類。上面的代碼裡面,Task就是我們自己定義的實現了TimerTask的類,因為是在同一個包裡面,所以沒有顯性的import進來。Task類的代碼如下
package test;
import java.util.TimerTask;
public class Task extends TimerTask {
public void run(){
System.out.println("定時任務執行");
}
}
我們的Task必須實現TimerTask的方法run,要執行的任務就在這個run方法裡面,這里,我們只讓它往控制台打一行字。
第二個參數
第二個參數是一個long型的值。這是延遲的時間,就是從程序開始以後,再過多少時間來執行定時任務。這個long型的值是毫秒數,所以前面我們的程序裡面,過一分鍾後執行用的參數值就是 60 * 1000。
二、循環執行
設置定時任務的時候,往往我們需要重復的執行這樣任務,每隔一段時間執行一次,而上面的方法是只執行一次的,這樣就用到了schele方法的是另一個重載函數
public void schele(TimerTask task,long delay,long period)
前兩個參數就不用說什麼了,最後一個參數就是間隔的時間,又是個long型的毫秒數(看來java里涉及到時間的,跟這個long是脫不了干係了),比如我們希望上面的任務從第一次執行後,每個一分鍾執行一次,第三個參數值賦60 * 1000就ok了。
三、指定執行時間
既然號稱是定時任務,我們肯定希望由我們來指定任務指定的時間,顯然上面的方法就不中用了,因為我們不知道程序什麼時間開始運行,就沒辦法確定需要延時多少。沒關系,schele四個重載的方法還沒用完呢。用下面這個就OK了:
public void schele(TimerTask task,Date time)
比如,我們希望定時任務2006年7月2日0時0分執行,只要給第二個參數傳一個時間設置為2006年7月2日0時0分的Date對象就可以了。
有一種情況是,可能我們的程序啟動的時候,已經是2006年7月3日了,這樣的話,程序一啟動,定時任務就開始執行了。
schele最後一個重載的方法是
public void schele(TimerTask task,Date firstTime,long period)

『貳』 java 定時任務的幾種實現方式

  1. JDK 自帶的定時器實現

    // schele(TimerTask task, long delay) 延遲 delay 毫秒 執行
    // schele(TimerTask task, Date time) 特定時間執行
    public static void main(String[] args) {
    for (int i = 0; i < 10; ++i) {
    new Timer("timer - " + i).schele(new TimerTask() {
    @Override
    public void run() {
    println(Thread.currentThread().getName() + " run ");
    }
    }, 1000);
    }
    }
    2. Quartz 定時器實現

    //首先我們需要定義一個任務類,比如為MyJob02 ,
    //該類需要繼承Job類,然後添加execute(JobExecutionContext context)方法,在
    //這個方法中就是我們具體的任務執行的地方。
    //由希望由調度程序執行的組件實現的介面
    public class MyJob02 implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
    // TODO Auto-generated method stub
    // 執行響應的任務.
    System.out.println("HelloJob.execute,"+new Date());
    }
    }

    public class QuartzTest5 {

    public static void main(String[] args) throws Exception {
    //SchelerFactory 是一個介面,用於Scheler的創建和管理
    SchelerFactory factory = new StdSchelerFactory();
    //從工廠裡面拿到一個scheler實例
    //計劃表(可能翻譯的不太貼切),現在我們有了要做的內容,
    //與調度程序交互的主要API
    /*
    * Scheler的生命期,從SchelerFactory創建它時開始,
    到Scheler調用shutdown()方法時結束;Scheler被創建後,
    可以增加、刪除和列舉Job和Trigger,以及執行其它與調度相關的操作
    (如暫停Trigger)。但是,Scheler只有在調用start()方法後,
    才會真正地觸發trigger(即執行job)
    */
    Scheler scheler = factory.getScheler();
    //具體任務.
    //用於定義作業的實例
    //JobBuilder - 用於定義/構建JobDetail實例,用於定義作業的實例。
    JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();


    //Trigger(即觸發器) - 定義執行給定作業的計劃的組件
    //TriggerBuilder - 用於定義/構建觸發器實例
    CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
    .withSchele(CronScheleBuilder.cronSchele("0/1 * * * * ?")).build();
    scheler.scheleJob(job, trigger);
    scheler.start();


    }
    3. Spring boot 任務調度(這個非常容易實現)

    /*
    * 開啟對定時任務的支持
    * 在相應的方法上添加@Scheled聲明需要執行的定時任務。
    */
    @EnableScheling
    //@EnableScheling註解來開啟對計劃任務的支持
    public class Application {

    public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
    }
    }

    @Component
    public class ScheledTasks {
    private Logger logger = LoggerFactory.getLogger(ScheledTasks.class);
    private int i=0;
    //0 0 0 2 * ?
    @Scheled(cron="* * * 2 * ?")
    //@Scheled 註解用於標注這個方法是一個定時任務的方法
    public void testFixDelay() {
    logger.info("執行方法"+i++);
    }

『叄』 JAVA實現定時任務的幾種方式

Java 基本的定時任務,總結方法有三種:

1 創建一個thread,然後讓它在while循環內里一直運行著,通過容sleep方法來達到定時任務的效果;

2 用Timer和TimerTask與第一種方法相比有如下好處:

3 用ScheledExecutorService是從的java.util.concurrent里,做為並發工具類被引進的,這是最理想的定時任務實現方式,相比於上兩個方法,它有以下好處:

『肆』 JAVA定時執行任務,每天定時幾點鍾執行任務

案例: 你想讓他幾點執行都ok

1.MyJob02
//首先我們需要定義一個任務類,比如為MyJob02 ,
//該類需要繼承Job類,然後添加execute(JobExecutionContext context)方法,在
//這個方法中就是我們具體的任務執行的地方。
//由希望由調度程序執行的組件實現的介面
public class MyJob02 implements Job {

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
// 執行響應的任務.

System.out.println("HelloJob.execute,"+new Date());
}
2.
public static void main(String[] args) throws Exception {
//SchelerFactory 是一個介面,用於Scheler的創建和管理
SchelerFactory factory = new StdSchelerFactory();
//從工廠裡面拿到一個scheler實例
//計劃表(可能翻譯的不太貼切),現在我們有了要做的內容,
//與調度程序交互的主要API
/*
* Scheler的生命期,從SchelerFactory創建它時開始,
到Scheler調用shutdown()方法時結束;Scheler被創建後,
可以增加、刪除和列舉Job和Trigger,以及執行其它與調度相關的操作
(如暫停Trigger)。但是,Scheler只有在調用start()方法後,
才會真正地觸發trigger(即執行job)
*/
Scheler scheler = factory.getScheler();
//具體任務.
//用於定義作業的實例
//JobBuilder - 用於定義/構建JobDetail實例,用於定義作業的實例。
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();

//Trigger(即觸發器) - 定義執行給定作業的計劃的組件
//TriggerBuilder - 用於定義/構建觸發器實例
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchele(CronScheleBuilder.cronSchele("0/1 * * * * ?")).build();
scheler.scheleJob(job, trigger);
scheler.start();

}

『伍』 java中每個月第一天執行一次任務的定時器如何實現

Date d = new Date();//獲取伺服器的時間。。。
Calendar c= Canlendar.getInstance();
c.setTime(d);

if(c.get(Calendar.DAY_OF_MONTH) == 1) //當前是1號
{
//拿出黨員的入黨日期(年月)同當前月進行比較 如果相同 發送簡訊
// //寫下你的判斷代碼
}
else //當前不是1號 則從下個月1號開始執行定期任務
{

c.set(Calendar.MONTH,c.get(Calendar.MONTH)+ 1);//設置為下月
c.set(Calendar.DAY_OF_MONTH,1);//設置為下月的1號

Timer timer =new Timer();

timer.scheleAtFixedRate(new TimerTask()
{
public void run()
{
//每天都來判斷一下 如果當前日期是1號
////則拿出黨員的入黨日期(年月)同當前月進行比較 如果相同 發送簡訊
//run函數里寫下你的判斷代碼
}},c.getTime(),24* 3600*1000); //每天執行一次run()方法...
}

『陸』 java的幾種定時任務

java定時任務有三種:

- JDK自帶 :JDK自帶的Timer以及JDK1.5+ 新增的ScheledExecutorService;


- Quartz :簡單卻強大的JAVA作業調度框架


- Spring3.0以後自帶的task :可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多;

代碼參考:

  1. JDK 自帶的定時器實現

    schele(TimerTask task, Date time) 特定時間執行


    public static void main(String[] args) {


    for (int i = 0; i < 10; ++i) {


    new Timer("timer - " + i).schele(new TimerTask() {


    @Override
    public void run() {


    println(Thread.currentThread().getName() + " run ");


    }


    }, new Date(System.currentTimeMillis() + 2000));


    }
    }

  2. Quartz 定時器實現

    2.1 通過maven引入依賴(這里主要介紹2.3.0) 注意:shiro-scheler中依賴的是1.x版本 如果同時使用會沖突

    <!-- https://mvnrepository.com/artifact/org.quartz-scheler/quartz -->


    <dependency>


    <groupId>org.quartz-scheler</groupId>


    <artifactId>quartz</artifactId>


    <version>2.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, SchelerException {


    Scheler scheler = new StdSchelerFactory().getScheler();


    // 開始


    scheler.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))

// 每隔一秒執行 並一直重復

.withSchele(SimpleScheleBuilder.simpleSchele().withIntervalInSeconds(1).repeatForever())
.build();

scheler.scheleJob(jobDetail , trigger);

Thread.sleep(5000);
// 刪除job

scheler.deleteJob(jobKey);


}

3.Spring 相關的任務調度

3.1 配置文件實現

spring-schele.xml

<task:scheler id="myScheler" pool-size="10" />


<task:scheled-tasks scheler="myScheler">


<task:scheled ref="job" method="test" cron="0 * * * * ?"/>


</task:scheled-tasks>

3.2註解實現

spring-schele.xml


<task:scheler id="myScheler" pool-size="10" />


// 啟用註解


<task:annotation-driven scheler="myScheler"/>

@Component
public class Task{

@Scheled(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實現定時任務的三種方法相關的資料

熱點內容
實例配置文件里的sid是什麼 瀏覽:43
ps文件模糊 瀏覽:192
葉檀財經推出過什麼購物APP 瀏覽:875
linux硬碟檢測 瀏覽:431
如何用路由器降低網路延遲 瀏覽:601
aix分區root密碼 瀏覽:439
運動鞋買鞋上什麼app 瀏覽:904
NSA工具下載 瀏覽:918
函數代碼在哪個文件夾 瀏覽:213
微信應用怎麼代碼添加快捷方式 瀏覽:371
用數據說話是最有力的什麼 瀏覽:27
圖片文件被鎖定無法打開 瀏覽:768
wr886nv2升級 瀏覽:490
移動硬碟視頻文件無法刪除 瀏覽:417
如何查看網路監控 瀏覽:132
列印機如何連接到網路列印機 瀏覽:181
vmlinux安裝tools 瀏覽:768
波形文件轉mp3 瀏覽:803
linux查看網路 瀏覽:163
如何從cad軟體里列印命令文件 瀏覽:247

友情鏈接