java定時任務處理

來源:互聯網
上載者:User

轉自:http://hi.baidu.com/axhack/blog/item/79cd2a45fdc59923cffca318.html

 

java定時任務處理方法2008-04-19 10:47

Java2的開發包中提供了一種很使用的線程功能:提前安排將來某段時間執行某任務Timer ,TimerTask。你可以使用這些類建立後台進程,讓其在等待一段規定的時間後執行,或者讓其沒隔一段時間執行。你也可以用Thread來完成,但利用Timer與TimerTask顯然省事不少。
TimerTask實現了Runnable介面,待執行的任務置於run()中。Timer是一個安排TimerTask的類此此兩者一般一起工作。所應用時首先硬建立一個TimerTask的對象,然後用一個Timer的類對象安排執行它
Timer類包含的方法有:
1.Timer()
以常規方式運行task
2.Timer(boolean)
true時使用後台進程線程。只要剩下的程式記敘運行,後台進程線程就會執行。
3.public void cancel()
終止Timer的功能執行,但不會對正在執行的任務有影響。當執行cancel方法後將不能再用其分配任務。
4.public void schedule(TimerTask task,Date time)
task被安排在time指定的時間執行,如果時間為過去時則任務立刻執行。
5.public void schedule(TimerTask task, Date firstTime, long period)
task被安排在time指定的時間執行,執行後將每隔period(毫秒)反覆執行。由於規定的時間間隔並不能保證與時鐘精準的同不步,所以該方
法最適合從短期看保持頻率準確是更重要的的地方
6.public void schedule(TimerTask task, long delay)
task被安排在delay(毫秒)指定的時間後執行。
7.public void schedule(TimerTask task,long delay, long period)
task被安排在delay(毫秒)指定的時間後執行。執行後將每隔period(毫秒)反覆執行。
8.public void scheduleAtFixedRate(TimerTask task,Date firstTime, long period)
task被安排在firstTime指定的時間執行。執行後將每隔period(毫秒)反覆執行。每一次重複的時間時盒第一次執行而不是和前一次執行有關

。因此執行的總速度是固定的。
9.public void scheduleAtFixedRate(TimerTask task,long delay,long period)
task被安排在delay(毫秒)指定的時間後執行。執行後將每隔period(毫秒)反覆執行。每一次重複的時間時盒第一次執行而不是和前一次執

行有關。因此執行的總速度是固定的。
TimerTask的主要方法:
1.public boolean cancel()
終止任務的執行運行。如果Timer時要求迴圈執行的,則如果正在執行,則執行完了就再步會迴圈。如果還未執行或處於停歇期,則不會執行


2.public abstract void run()
3.public long scheduledExecutionTime()
返回被安排最後執行任務的時間。一般確定任務的當今的實行是否足夠及時 ,證明進行被計劃的活動為正當:
public void run() {
if (System.currentTimeMillis() - scheduledExecutionTime() >=
MAX_TARDINESS)
return; // Too late; skip this execution.
// Perform the task
}

4.protected TimerTask()

 

例:

import java.util.*;
import java.io.*;

 

public class doTask extends TimerTask {
String index;
Timer myTimer = new Timer();
public doTask(String index) {
this.index = index;
}

public void run() {
System.out.println(index);
}

public static void main(String args[]) {
doTask myTask1 = new doTask("First task");
myTask1.start(0,3);
doTask myTask2 = new doTask("Second task");
myTask2.start(0,1);

try{
Thread.sleep(6000);
}
catch(InterruptedException e){ 
}

myTask1.end();
myTask2.end();//程式結束時用cancel()結束Timer

}

public void start(int delay, int internal) {
myTimer.schedule(this, delay * 1000, internal * 1000); //利用timer.schedule方法
}
public void end(){
myTimer.cancel();
}
}

輸出:
First task
Second task
Second task
Second task
First task
Second task
Second task
Second task

===================================================

timer及timertask的用法

使用TimerTask

 

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

/**
* @author vincent
*/
public class TimerTest {

public static void main(String[] args) {
Timer t = new Timer();

//在5秒之後執行TimerTask的任務
t.schedule(new TimerTask(){
public void run()
{System.out.println("this is task you do1");}
},5*1000);

//在Date指定的特定時刻之後執行TimerTask的任務
Date d1 = new Date(System.currentTimeMillis()+1000);
t.schedule(new TimerTask(){
public void run()
{System.out.println("this is task you do2");}
},d1);

//在Date指定的特定時刻之後,每隔1秒執行TimerTask的任務一次
Date d2 = new Date(System.currentTimeMillis()+1000);
t.schedule(new TimerTask(){
public void run()
{System.out.println("this is task you do3");}
},d2,1*1000);

//在3秒之後,每隔1秒執行TimerTask的任務一次
t.schedule(new TimerTask(){
public void run()
{System.out.println("this is task you do4");}
},3*1000,1*1000);

//在3秒之後,絕對每隔2秒執行TimerTask的任務一次

t.scheduleAtFixedRate(new TimerTask(){
public void run()
{System.out.println("this is task you do6");}
},3*1000,2*1000);
}

schedule和scheduleAtFixedRate的區別在於,如果指定開始執行的時間在當前系統已耗用時間之前,scheduleAtFixedRate會把已經過去的時間也作為周期執行,而schedule不會把過去的時間算上。

比如

SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date d1 = fTime.parse("2005/12/30 14:10:00");

t.scheduleAtFixedRate(new TimerTask(){
public void run()
{
System.out.println("this is task you do6");
}
},d1,3*60*1000);

間隔時間是3分鐘,指定開始時間是2005/12/30 14:10:00,如果我在14:17:00分執行這個程式,那麼會立刻列印3次

this is task you do6 //14:10
this is task you do6 //14:13
this is task you do6 //14:16

並且注意,下一次執行是在14:19 而不是 14:20。就是說是從指定的開始時間開始計時,而不是從執行時間開始計時。

但是上面如果用schedule方法,間隔時間是3分鐘,指定開始時間是2005/12/30 14:10:00,那麼在14:17:00分執行這個程式,則立即執行程式一次。並且下一次的執行時間是 14:20,而不是從14:10開始算的周期(14:19)。

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.