當前位置:首頁 » 編程語言 » java中的定時任務

java中的定時任務

發布時間: 2022-09-03 18:18:19

java 怎麼寫定時任務

如果要執行一些簡單的定時器任務,無須做復雜的控制,也無須保存狀態,那麼可以考慮使用JDK 入門級的定期器Timer來執行重復任務。

一、原理

JDK中,定時器任務的執行需要兩個基本的類:
java.util.Timer;
java.util.TimerTask;

要運行一個定時任務,最基本的步驟如下:
1、建立一個要執行的任務TimerTask。
2、創建一個Timer實例,通過Timer提供的schele()方法,將 TimerTask加入到定時器Timer中,同時設置執行的規則即可。

當程序執行了Timer初始化代碼後,Timer定時任務就會按照設置去執行。

Timer中的schele()方法是有多種重載格式的,以適應不同的情況。該方法的格式如下:
void schele(TimerTask task, Date time)
安排在指定的時間執行指定的任務。
void schele(TimerTask task, Date firstTime, long period)
安排指定的任務在指定的時間開始進行重復的固定延遲執行。
void schele(TimerTask task, long delay)
安排在指定延遲後執行指定的任務。
void schele(TimerTask task, long delay, long period)
安排指定的任務從指定的延遲後開始進行重復的固定延遲執行。

Timer是線程安全的,此類可擴展到大量同時安排的任務(存在數千個都沒有問題)。其所有構造方法都啟動計時器線程。可以調用cancel() 終止此計時器,丟棄所有當前已安排的任務。purge()從此計時器的任務隊列中移除所有已取消的任務。此類不提供實時保證:它使用 Object.wait(long) 方法來安排任務。

TimerTask是一個抽象類,由 Timer 安排為一次執行或重復執行的任務。它有一個抽象方法run()----計時器任務要執行的操作。因此,每個具體的任務類都必須繼承TimerTask類,並且重寫run()方法。另外它還有兩個非抽象的方法:
boolean cancel()
取消此計時器任務。
long scheledExecutionTime()
返回此任務最近實際 執行的安排 執行時間。

二、例子

下面用Timer實現一個簡單例子:

package stu.timer;

import java.util.Date;
import java.util.TimerTask;

/**
* 重復執行的任務
*
* @author leimin,2008-10-9 9:20:20
*/
public class TestTimerTask extends TimerTask {
/**
* 此計時器任務要執行的操作。
*/
public void run() {
Date executeTime = new Date(this.scheledExecutionTime());
System.out.println("本次任務執行的時間是" + executeTime);
}
}

package stu.timer;

import java.util.Timer;
import java.util.TimerTask;

/**
* 測試JDK Timer的執行
*
* @author leimin,2008-10-9 9:24:35
*/
public class TestTimer {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask task = new TestTimerTask();
timer.schele(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
......

❷ Spring task定時任務

在Java中有三種實現定時任務的方式:1.java自帶的API java.util.Timer類 java.util.TimerTask類 。2. Quartz框架 開源 功能強大 使用起來稍顯復雜. 3.Spring 3.0以後自帶了 task 調度工具,比Quartz更加的簡單方便.

Spring從3.0後自帶了task調度工具,不需要引入其他的第三方依賴。在啟動類上添加 @EnableScheling 註解

ScheleTask.java

在需要定時執行的方法上添加 @Scheled 註解並指定cron的值,上面的這個例子讓列印語句每天凌晨兩點執行一次。

這個註解標記了一個將要被定時執行的方法, cron fixedDelay fixedRate 三個屬性必選其一。

被註解的方法不能傳入參數,通常有一個 void 的返回值,如果不是,返回值將會被忽略。

cron 是一個類似cron的表達式,可以指定秒、分、時、一個月的第幾天、月、一周的星期幾。例如,"0 * * * * MON-FRI"表示工作日的每一分鍾都執行。

zone 指定了cron表達式的時區。如果未指定,則是伺服器的默認時區。

fixedDelay :執行註解方法的固定的毫秒數間隔,這個間隔是指上一次調用的結束和下一次調用的開始的時間。

fixedRate :執行註解方法的固定的毫秒數間隔,這個間隔是指每次調用之間的時間。與上面的區別是:fixedDelay是前一個方法執行完畢後的固定時間再執行下一個方法,fixedRate是上一個方法開始執行固定時間後執行下一個方法。

cron表達式可以分為兩種:

1、6位長度的秒 分 時 日 月 星期

2、7位長度的秒 分 時 日 月 星期 年

一般都是用6位長度的。

秒:可出現 , - * / 四個字元,有效范圍為0-59的整數

分:可出現 ,- * / 四個字元,有效范圍為0-59的整數

時:可出現 ,- * / 四個字元,有效范圍為0-23的整數

日:可出現 ,- * / ? L W C 八個字元,有效范圍為0-31的整數

月:可出現 ,- * / 四個字元,有效范圍為1-12的整數或JAN-DEC

星期:可出現 ,- * / ? L C # 八個字元,有效范圍為1-7的整數或SUN-SAT兩個范圍。1表示星期天

年:可出現 ,- * / 四個字元,有效范圍為1970-2099年

(1)*:表示匹配該域的任意值,假如在Minutes域使用*,即表示每分鍾都會觸發事件。

(2)?:只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,但實際不會。因為DayofMonth和DayofWeek會相互影響。
例如想在每月的20日觸發調度,不管20日到底是星期幾,則只能使用如下寫法: 13 13 15 20 * ?,其中最後一位只能用?,而不能使用*,如果使用*表示不管星期幾都會觸發,實際上並不是這樣。

(3)-:表示範圍,例如在Minutes域使用5-20,表示從5分到20分鍾每分鍾觸發一次

(4)/:表示起始時間開始觸發,然後每隔固定時間觸發一次,例如在Minutes域使用5/20,則意味著5分鍾觸發一次,而25,45等分別觸發一次.

(5),:表示列出枚舉值值。例如:在Minutes域使用5,20,則意味著在5和20分每分鍾觸發一次。

(6)L:表示最後,只能出現在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味著在最後的一個星期四觸發。

(7)W:表示有效工作日(周一到周五),只能出現在DayofMonth域,系統將在離指定日期的最近的有效工作日觸發事件。
例如:在DayofMonth使用5W,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日觸發;
如果5日在星期一到星期五中的一天,則就在5日觸發。另外一點,W的最近尋找不會跨過月份

(8)LW:這兩個字元可以連用,表示在某個月最後一個工作日,即最後一個星期五。
(9)#:用於確定每個月第幾個星期幾,只能出現在DayofMonth域。例如在4#2,表示某月的第二個星期三。

有時候需要執行的定時任務會很多,如果是串列執行會帶來一些問題,比如一個很耗時的任務阻塞住了,一些需要短周期循環執行的任務也會卡住,所以可以配置一個線程池來並行執行定時任務。

有兩種配置方式,一種是寫一個配置類創建一個線程池,另一種是在yml文件中進行配置創建線程池。

配置文件的方式:

❸ JAVA中定時自動完成任務的實現要注意什麼

定時任務本身不會有沖突,有沖突的是任務中操作處理的資源或數據,需要對有寫入的文件或數據進行排它鎖,保障線程處理的安全性。

❹ 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定時任務Timer 關於定時任務,似乎跟時間操作的聯系並不是很大,但是前面既然提到了定時任務,索性在這里一起解決了。設置定時任務很簡單,用Timer類就搞定了。一、延時執行首先,我們定義一個類,給它取個名字叫TimeTask,我們的定時任務,就在這個類的main函數里執行。代碼如下:
package test;
import java.util.Timer;
public class TimeTaskTest {
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)
沒必要說什麼了吧:)四、j2ee中的定時任務在實際的項目中,往往定時任務需要對web工程中的資源進行操作,這樣一來,用上面的單個程序的方式可能就有點力不從心了,因為很多web工程的資源它操作不到。解決的辦法是,使用Servlet,把執行定時任務的那些代碼放到Servlet的init()函數里就可以了,這個easy,就沒有必要再寫示例代碼了吧

❻ java消息定時推送怎麼實現

定時任務實現的幾種方式:
Timer:這是java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。使用這種方式可以讓程序按照某一個頻度執行,但不能在指定時間運行。一般用的較少。
ScheledExecutorService:也jdk自帶的一個類;
是基於線程池設計的定時任務類,每個調度任務都會分配到線程池中的一個線程去執行,也就是說,任務是並發執行,互不影響。Spring Task:Spring3.0以後自帶的task,可以看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。
Quartz:這是一個功能比較強大的的調度器,可以讓程序在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯復雜。
消息推送推薦選擇極光推送軟體,JPush 是經過考驗的大規模 App 推送平台,每天推送消息量級為數百億條。 開發者集成 SDK 後,可以通過調用 API 推送消息。同時,JPush 提供可視化的 web 端控制台發送通知,統計分析推送效果。 JPush 全面支持 Android, iOS, Winphone 三大手機平台。

❼ 在Java中如何設置一個定時任務的代碼應該怎麼寫

指定定時任務的代碼如下:

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)java.util.Timer
這個方法應該是最常用的,不過這個方法需要手工啟動你的任務:
Timer timer=new Timer();
timer.schele(new ListByDayTimerTask(),10000,86400000);
這里的ListByDayTimerTask類必須extends TimerTask裡面的run()方法。
2)ServletContextListener
這個方法在web容器環境比較方便,這樣,在web server啟動後就可以
自動運行該任務,不需要手工操作。
將ListByDayListener implements ServletContextListener介面,在
contextInitialized方法中加入啟動Timer的代碼,在contextDestroyed
方法中加入cancel該Timer的代碼;然後在web.xml中,加入listener:
詳細教程請參考: http://java.e800.com.cn/articles/2010/1012/1286862116545_1.html

❾ JAVA實現定時任務的幾種方式

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

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

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

  • 當啟動和去取消任務時可以控制

  • 第一次執行任務時可以指定你想要的delay時間

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

  • 相比於Timer的單線程,它是通過線程池的方式來執行任務的

  • 可以很靈活的去設定第一次執行任務delay時間

  • 提供了良好的約定,以便設定執行的時間間隔

❿ Java中定時任務的幾種實現

在開發測試工具的應用後台,經常聽到同事說要做個定時任務把做日誌處理,或者數據清理,包括做些復雜的業務計算邏輯,在選擇定時任務的時候,怎麼能夠快速實現,並且選擇一種更適合自己的方式呢? 我這里把定時任務的實現收集整理了一些方法,希望可以幫到剛開始做定時任務的同學,寫得不對的地方請指正。

熱點內容
抽盒機演算法 發布:2025-01-15 18:31:07 瀏覽:252
萬網雲伺服器雲虛擬主機 發布:2025-01-15 18:20:58 瀏覽:946
手動安裝交叉編譯鏈 發布:2025-01-15 18:15:30 瀏覽:565
java調用clinux 發布:2025-01-15 18:13:02 瀏覽:294
如何給孩子配置一份保險 發布:2025-01-15 18:07:53 瀏覽:457
思科模擬器ftp配置 發布:2025-01-15 18:01:53 瀏覽:197
wd軟體如何修改密碼 發布:2025-01-15 17:59:57 瀏覽:715
公共代理伺服器地址 發布:2025-01-15 17:59:53 瀏覽:819
android文件圖片 發布:2025-01-15 17:39:44 瀏覽:206
linux的路徑怎麼寫 發布:2025-01-15 17:18:49 瀏覽:185