當前位置:首頁 » 編程語言 » java定時執行

java定時執行

發布時間: 2022-10-17 15:27:38

1. 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
......

2. java 定時器字自動執行方法

  1. 為了不阻塞主線程,定時器應該開辟一個子線程去完成。

  2. 需要每秒輪詢檢測時間點是否符合條件。

示例代碼如下:

public static void main(String[] args){

new Thread(){

private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

public void run() {

while(true){

try {

String currentTimeStr = sdf.format(new Date());

System.out.println("w=" + currentTimeStr);

if(currentTimeStr.equals("00:00")){

A();

System.out.println(currentTimeStr);

}

sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

private void A(){

System.out.println("夜深了,該休息了。");

}

}.start();

//阻塞主線程,不讓程序結束。

while(true);

}

3. java定時器 每天12點 固定執行一個方法

可以使用timer的schele方法實現定時任務,例如:把下面的new Date()參數換為你要定時的時間,創建一個線程執行你的任務

public class 定時 {

public static void main(String[] args) {
Timer timer = new Timer();
timer.schele(new myTest(), new Date());
}
}

class myTest extends TimerTask {

@Override
public void run() {
//你要執行的任務
}
System.out.println(hour + ":" + fen + ":" + sec + ":" + i);

}

修改一下就可以了

4. java定時執行一個方法

現在能想到的是三種方法能實現:
1、普通thread實現 :是最常見的,創建一個thread,然後讓它在while循環里一直運行著,通過sleep方法來達到定時任務的效果。
2、TimerTask :啟動和去取消任務時可以控制,第一次執行任務時可以指定你想要的delay時間。
3、ScheledExecutorService實現 :最理想的定時任務實現方式,相比於Timer的單線程,它是通過線程池的方式來執行任務的,可以很靈活的去設定第一次執行任務delay時間,提供了良好的約定,以便設定執行的時間間隔等。
希望能幫到你。

5. java定時器 每天凌晨 固定執行一個方法

二、如果是需要Tomcat啟動就能執行,不需要main方法的定時器的話:
web.xml裡面需要這么配置:

<listener>
<listener-class>
com.InitListener
</listener-class>
</listener>
第一個類:InitListener

package com.listener;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
* 系統啟動時的監聽類 初始化系統數據
*
* @author jhoneder
*
*/
public class InitListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
// context銷毀時,銷毀初始化數據
}
public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
try {
goTimmer();
} catch (Exception e) {
System.out.println("失敗:" + e.getMessage());
}
}
private void goTimer() {
Timer timmerTask = new Timer();
Calendar calEnviron = Calendar.getInstance();
// 每天的02:00.am開始執行
calEnviron.set(Calendar.HOUR_OF_DAY, 2);
calEnviron.set(Calendar.MINUTE, 00);
// date為制定時間
Date dateSetter = new Date();
dateSetter = calEnviron.getTime();
// nowDate為當前時間
Date nowDateSetter = new Date();
// 所得時間差為,距現在待觸發時間的間隔
long intervalEnviron = dateSetter.getTime() - nowDateSetter.getTime();
if (intervalEnviron < 0) {
calEnviron.add(Calendar.DAY_OF_MONTH, 1);
dateSetter = calEnviron.getTime();
intervalEnviron = dateSetter.getTime() - nowDateSetter.getTime();
}
// 每24小時執行一次
timmerTask.schele(new UseTimer(timmerTask), intervalEnviron, 1 * 1000 * 60 * 60 * 24);
}
}

第二個類:

package com.listener;
import java.util.Timer;
import java.util.TimerTask;
/**
* 被調用執行類
*
* @author Administrator
*
*/
public class UseTimer extends TimerTask {
Timer timer = new Timer();
public UseTimer(Timer timer) {
this.timer = timer;
}
/*
* 被調用具體的方法
*/
public void run() {
System.out.println("開始具體執行!");
}
}

不懂得話可以追問!

6. 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秒執行一次進入測試");


}
}

7. 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++);
    }

8. 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();

}

9. 用java里timer執行定時任務,怎麼寫

Timer
timer
=
new
Timer();
timer.schele(new
MyTask(),
firstTime,
24*60*60*1000L);
timer.schele(new
MyTask(),
secondTime,24*60*60*1000L);
timer.schele(new
MyTask(),
ThirdTime,
24*60*60*1000L);
其中三個時間分別為一天的8:00/12:00/14:00點,可以用SimpleDateFormat類

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

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

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

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

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

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

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

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

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

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

熱點內容
國家基礎資料庫 發布:2024-12-24 10:58:20 瀏覽:923
python是否是字元串 發布:2024-12-24 10:56:51 瀏覽:524
疫區的消毒應怎麼配置 發布:2024-12-24 10:55:31 瀏覽:241
可樂雲解壓密碼 發布:2024-12-24 10:50:18 瀏覽:759
數據存儲與容災 發布:2024-12-24 10:49:47 瀏覽:597
蘋果安卓哪個好玩 發布:2024-12-24 10:44:00 瀏覽:317
怎麼在電腦上建網站上傳ftp 發布:2024-12-24 10:34:36 瀏覽:777
linux下安裝驅動 發布:2024-12-24 10:33:03 瀏覽:652
什麼人用獨立伺服器 發布:2024-12-24 10:22:09 瀏覽:683
mysql存儲過程異常回滾 發布:2024-12-24 10:22:07 瀏覽:842