真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java中定時(shí)任務(wù)的代碼 Java手動(dòng)調(diào)用定時(shí)任務(wù)

怎么用Java實(shí)現(xiàn)定時(shí)執(zhí)行某程序

java中設(shè)置定時(shí)任務(wù)用Timer類可以實(shí)現(xiàn)。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供句容網(wǎng)站建設(shè)、句容做網(wǎng)站、句容網(wǎng)站設(shè)計(jì)、句容網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、句容企業(yè)網(wǎng)站模板建站服務(wù),十余年句容做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

一、延時(shí)執(zhí)行

首先,我們定義一個(gè)類,給它取個(gè)名字叫TimeTask,我們的定時(shí)任務(wù),就在這個(gè)類的main函數(shù)里執(zhí)行。代碼如下:

package test;

import java.util.Timer;

public class TimeTask {

public static void main(String[] args){

Timer timer = new Timer();

timer.schedule(new Task(), 60 * 1000);

}

}

解釋一下上面的代碼。

上面的代碼實(shí)現(xiàn)了這樣一個(gè)功能,當(dāng)TimeTask程序啟動(dòng)以后,過一分鐘后執(zhí)行某項(xiàng)任務(wù)。很簡單吧:先new一個(gè)Timer對(duì)象,然后調(diào)用它的schedule方法,這個(gè)方法有四個(gè)重載的方法,這里我們用其中一個(gè),

public void schedule(TimerTask task,long delay)

首先,第一個(gè)參數(shù)

第一個(gè)參數(shù)就是我們要執(zhí)行的任務(wù)。

這是一個(gè)TimerTask對(duì)象,確切點(diǎn)說是一個(gè)實(shí)現(xiàn)TimerTask的類的對(duì)象,因?yàn)門imerTask是個(gè)抽象類。上面的代碼里面,Task就是我們自己定義的實(shí)現(xiàn)了TimerTask的類,因?yàn)槭窃谕粋€(gè)包里面,所以沒有顯性的import進(jìn)來。Task類的代碼如下

package test;

import java.util.TimerTask;

public class Task extends TimerTask {

public void run(){

System.out.println("定時(shí)任務(wù)執(zhí)行");

}

}

我們的Task必須實(shí)現(xiàn)TimerTask的方法run,要執(zhí)行的任務(wù)就在這個(gè)run方法里面,這里,我們只讓它往控制臺(tái)打一行字。

第二個(gè)參數(shù)

第二個(gè)參數(shù)是一個(gè)long型的值。這是延遲的時(shí)間,就是從程序開始以后,再過多少時(shí)間來執(zhí)行定時(shí)任務(wù)。這個(gè)long型的值是毫秒數(shù),所以前面我們的程序里面,過一分鐘后執(zhí)行用的參數(shù)值就是 60 * 1000。

二、循環(huán)執(zhí)行

設(shè)置定時(shí)任務(wù)的時(shí)候,往往我們需要重復(fù)的執(zhí)行這樣任務(wù),每隔一段時(shí)間執(zhí)行一次,而上面的方法是只執(zhí)行一次的,這樣就用到了schedule方法的是另一個(gè)重載函數(shù)

public void schedule(TimerTask task,long delay,long period)

前兩個(gè)參數(shù)就不用說什么了,最后一個(gè)參數(shù)就是間隔的時(shí)間,又是個(gè)long型的毫秒數(shù)(看來java里涉及到時(shí)間的,跟這個(gè)long是脫不了干系了),比如我們希望上面的任務(wù)從第一次執(zhí)行后,每個(gè)一分鐘執(zhí)行一次,第三個(gè)參數(shù)值賦60 * 1000就ok了。

三、指定執(zhí)行時(shí)間

既然號(hào)稱是定時(shí)任務(wù),我們肯定希望由我們來指定任務(wù)指定的時(shí)間,顯然上面的方法就不中用了,因?yàn)槲覀儾恢莱绦蚴裁磿r(shí)間開始運(yùn)行,就沒辦法確定需要延時(shí)多少。沒關(guān)系,schedule四個(gè)重載的方法還沒用完呢。用下面這個(gè)就OK了:

public void schedule(TimerTask task,Date time)

比如,我們希望定時(shí)任務(wù)2006年7月2日0時(shí)0分執(zhí)行,只要給第二個(gè)參數(shù)傳一個(gè)時(shí)間設(shè)置為2006年7月2日0時(shí)0分的Date對(duì)象就可以了。

有一種情況是,可能我們的程序啟動(dòng)的時(shí)候,已經(jīng)是2006年7月3日了,這樣的話,程序一啟動(dòng),定時(shí)任務(wù)就開始執(zhí)行了。

schedule最后一個(gè)重載的方法是

public void schedule(TimerTask task,Date firstTime,long period)

JAVA定時(shí)執(zhí)行任務(wù),每天定時(shí)幾點(diǎn)鐘執(zhí)行任務(wù)

案例: 你想讓他幾點(diǎn)執(zhí)行都o(jì)k

1.MyJob02

//首先我們需要定義一個(gè)任務(wù)類,比如為MyJob02 ,

//該類需要繼承Job類,然后添加execute(JobExecutionContext context)方法,在

//這個(gè)方法中就是我們具體的任務(wù)執(zhí)行的地方。

//由希望由調(diào)度程序執(zhí)行的組件實(shí)現(xiàn)的接口

public class MyJob02 implements Job {

@Override

public void execute(JobExecutionContext context) throws JobExecutionException {

// TODO Auto-generated method stub

// 執(zhí)行響應(yīng)的任務(wù).

System.out.println("HelloJob.execute,"+new Date());

}

2.

public static void main(String[] args) throws Exception {

//SchedulerFactory 是一個(gè)接口,用于Scheduler的創(chuàng)建和管理

SchedulerFactory factory = new StdSchedulerFactory();

//從工廠里面拿到一個(gè)scheduler實(shí)例

//計(jì)劃表(可能翻譯的不太貼切),現(xiàn)在我們有了要做的內(nèi)容,

//與調(diào)度程序交互的主要API

/*

* Scheduler的生命期,從SchedulerFactory創(chuàng)建它時(shí)開始,

到Scheduler調(diào)用shutdown()方法時(shí)結(jié)束;Scheduler被創(chuàng)建后,

可以增加、刪除和列舉Job和Trigger,以及執(zhí)行其它與調(diào)度相關(guān)的操作

(如暫停Trigger)。但是,Scheduler只有在調(diào)用start()方法后,

才會(huì)真正地觸發(fā)trigger(即執(zhí)行job)

*/

Scheduler scheduler = factory.getScheduler();

//具體任務(wù).

//用于定義作業(yè)的實(shí)例

//JobBuilder - 用于定義/構(gòu)建JobDetail實(shí)例,用于定義作業(yè)的實(shí)例。

JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();

//Trigger(即觸發(fā)器) - 定義執(zhí)行給定作業(yè)的計(jì)劃的組件

//TriggerBuilder - 用于定義/構(gòu)建觸發(fā)器實(shí)例

CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")

.withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")).build();

scheduler.scheduleJob(job, trigger);

scheduler.start();

}

java定時(shí)任務(wù)怎么實(shí)現(xiàn)

/**

* 普通thread

* 這是最常見的,創(chuàng)建一個(gè)thread,然后讓它在while循環(huán)里一直運(yùn)行著,

* 通過sleep方法來達(dá)到定時(shí)任務(wù)的效果。這樣可以快速簡單的實(shí)現(xiàn),代碼如下:

* @author GT

*

*/

public class Task1 {

public static void main(String[] args) {

// run in a second

final long timeInterval = 1000;

Runnable runnable = new Runnable() {

public void run() {

while (true) {

// ------- code for task to run

System.out.println("Hello !!");

// ------- ends here

try {

Thread.sleep(timeInterval);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

};

Thread thread = new Thread(runnable);

thread.start();

}

}

[java] view plain copy

import java.util.Timer;

import java.util.TimerTask;

/**

*

* 于第一種方式相比,優(yōu)勢 1當(dāng)啟動(dòng)和去取消任務(wù)時(shí)可以控制 2第一次執(zhí)行任務(wù)時(shí)可以指定你想要的delay時(shí)間

*

* 在實(shí)現(xiàn)時(shí),Timer類可以調(diào)度任務(wù),TimerTask則是通過在run()方法里實(shí)現(xiàn)具體任務(wù)。 Timer實(shí)例可以調(diào)度多任務(wù),它是線程安全的。

* 當(dāng)Timer的構(gòu)造器被調(diào)用時(shí),它創(chuàng)建了一個(gè)線程,這個(gè)線程可以用來調(diào)度任務(wù)。 下面是代碼:

*

* @author GT

*

*/

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

}

[java] view plain copy

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

/**

*

*

* ScheduledExecutorService是從Java SE5的java.util.concurrent里,做為并發(fā)工具類被引進(jìn)的,這是最理想的定時(shí)任務(wù)實(shí)現(xiàn)方式。

* 相比于上兩個(gè)方法,它有以下好處:

* 1相比于Timer的單線程,它是通過線程池的方式來執(zhí)行任務(wù)的

* 2可以很靈活的去設(shè)定第一次執(zhí)行任務(wù)delay時(shí)間

* 3提供了良好的約定,以便設(shè)定執(zhí)行的時(shí)間間隔

*

* 下面是實(shí)現(xiàn)代碼,我們通過ScheduledExecutorService#scheduleAtFixedRate展示這個(gè)例子,通過代碼里參數(shù)的控制,首次執(zhí)行加了delay時(shí)間。

*

*

* @author GT

*

*/

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

// 第二個(gè)參數(shù)為首次執(zhí)行的延時(shí)時(shí)間,第三個(gè)參數(shù)為定時(shí)執(zhí)行的間隔時(shí)間

service.scheduleAtFixedRate(runnable, 10, 1, TimeUnit.SECONDS);

}

}

Java 如何實(shí)現(xiàn)這樣的定時(shí)任務(wù)

JDK中,定時(shí)器任務(wù)的執(zhí)行需要兩個(gè)基本的類:

java.util.Timer;

java.util.TimerTask;

要運(yùn)行一個(gè)定時(shí)任務(wù),最基本的步驟如下:

1、建立一個(gè)要執(zhí)行的任務(wù)TimerTask。

2、創(chuàng)建一個(gè)Timer實(shí)例,通過Timer提供的schedule()方法,將 TimerTask加入到定時(shí)器Timer中,同時(shí)設(shè)置執(zhí)行的規(guī)則即可。

當(dāng)程序執(zhí)行了Timer初始化代碼后,Timer定時(shí)任務(wù)就會(huì)按照設(shè)置去執(zhí)行。

Timer中的schedule()方法是有多種重載格式的,以適應(yīng)不同的情況。該方法的格式如下:

void schedule(TimerTask task, Date time)

安排在指定的時(shí)間執(zhí)行指定的任務(wù)。

void schedule(TimerTask task, Date firstTime, long period)

安排指定的任務(wù)在指定的時(shí)間開始進(jìn)行重復(fù)的固定延遲執(zhí)行。

void schedule(TimerTask task, long delay)

安排在指定延遲后執(zhí)行指定的任務(wù)。

void schedule(TimerTask task, long delay, long period)

安排指定的任務(wù)從指定的延遲后開始進(jìn)行重復(fù)的固定延遲執(zhí)行。

Timer是線程安全的,此類可擴(kuò)展到大量同時(shí)安排的任務(wù)(存在數(shù)千個(gè)都沒有問題)。其所有構(gòu)造方法都啟動(dòng)計(jì)時(shí)器線程??梢哉{(diào)用cancel() 終止此計(jì)時(shí)器,丟棄所有當(dāng)前已安排的任務(wù)。purge()從此計(jì)時(shí)器的任務(wù)隊(duì)列中移除所有已取消的任務(wù)。此類不提供實(shí)時(shí)保證:它使用 Object.wait(long) 方法來安排任務(wù)。

TimerTask是一個(gè)抽象類,由 Timer 安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。它有一個(gè)抽象方法run()----計(jì)時(shí)器任務(wù)要執(zhí)行的操作。因此,每個(gè)具體的任務(wù)類都必須繼承TimerTask類,并且重寫run()方法。另外它還有兩個(gè)非抽象的方法:

boolean cancel()

取消此計(jì)時(shí)器任務(wù)。

long scheduledExecutionTime()

返回此任務(wù)最近實(shí)際 執(zhí)行的安排 執(zhí)行時(shí)間。

java怎么用定時(shí)任務(wù)實(shí)現(xiàn)失效

1、ZSet 實(shí)現(xiàn)方式

通過 ZSet 實(shí)現(xiàn)定時(shí)任務(wù)的思路是,將定時(shí)任務(wù)存放到 ZSet 集合中,并且將過期時(shí)間存儲(chǔ)到 ZSet 的 Score 字段中,然后通過一個(gè)無線循環(huán)來判斷當(dāng)前時(shí)間內(nèi)是否有需要執(zhí)行的定時(shí)任務(wù),如果有則進(jìn)行執(zhí)行,具體實(shí)現(xiàn)代碼如下:

import redis.clients.jedis.Jedis;

import utils.JedisUtils;

import java.time.Instant;

import java.util.Set;

public class DelayQueueExample {

private static final String _KEY = "DelayQueueExample";

public static void main(String[] args) throws InterruptedException {

Jedis jedis = JedisUtils.getJedis();

// 30s 后執(zhí)行

long delayTime = Instant.now().plusSeconds(30).getEpochSecond();

jedis.zadd(_KEY, delayTime, "order_1");

// 繼續(xù)添加測試數(shù)據(jù)

jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_2");

jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_3");

jedis.zadd(_KEY, Instant.now().plusSeconds(7).getEpochSecond(), "order_4");

jedis.zadd(_KEY, Instant.now().plusSeconds(10).getEpochSecond(), "order_5");

// 開啟定時(shí)任務(wù)隊(duì)列

doDelayQueue(jedis);

}

/**

* 定時(shí)任務(wù)隊(duì)列消費(fèi)

* @param jedis Redis 客戶端

*/

public static void doDelayQueue(Jedis jedis) throws InterruptedException {

while (true) {

// 當(dāng)前時(shí)間

Instant nowInstant = Instant.now();

long lastSecond = nowInstant.plusSeconds(-1).getEpochSecond();

// 上一秒時(shí)間

long nowSecond = nowInstant.getEpochSecond();

// 查詢當(dāng)前時(shí)間的所有任務(wù)

Set data = jedis.zrangeByScore(_KEY, lastSecond, nowSecond);

for (String item : data) {

// 消費(fèi)任務(wù)

System.out.println("消費(fèi):" + item);

}

// 刪除已經(jīng)執(zhí)行的任務(wù)

jedis.zremrangeByScore(_KEY, lastSecond, nowSecond);

Thread.sleep(1000); // 每秒查詢一次

}

}

}

登錄后復(fù)制

?

2、鍵空間通知

我們可以通過 Redis 的鍵空間通知來實(shí)現(xiàn)定時(shí)任務(wù),它的實(shí)現(xiàn)思路是給所有的定時(shí)任務(wù)設(shè)置一個(gè)過期時(shí)間,等到了過期之后,我們通過訂閱過期消息就能感知到定時(shí)任務(wù)需要被執(zhí)行了,此時(shí)我們執(zhí)行定時(shí)任務(wù)即可。

默認(rèn)情況下 Redis 是不開啟鍵空間通知的,需要我們通過 config set notify-keyspace-events Ex 的命令手動(dòng)開啟,開啟之后定時(shí)任務(wù)的代碼如下


本文名稱:java中定時(shí)任務(wù)的代碼 Java手動(dòng)調(diào)用定時(shí)任務(wù)
URL分享:http://weahome.cn/article/hidioo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部