利用 java.util.Timer來寫一個定時器


@大神愛吃茶

  java.util.Timer中的TimerTask類

  這個包java.util.Timer是Java中的一個實用工具類,用來調度將來某個時間執行的線程。

  TimerTask類的源碼:

public abstract class TimerTask implements Runnable {
    final Object lock = new Object();

    int state = VIRGIN;   

    static final int VIRGIN = 0;

    static final int SCHEDULED   = 1;

    static final int EXECUTED    = 2;

    static final int CANCELLED   = 3;    

    long nextExecutionTime;

    long period = 0;

    protected TimerTask() {
    }

    public abstract void run();
    public boolean cancel() {
        synchronized(lock) {
            boolean result = (state == SCHEDULED);
            state = CANCELLED;
            return result;
        }
    }

    public long scheduledExecutionTime() {
        synchronized(lock) {
            return (period < 0 ? nextExecutionTime + period
                               : nextExecutionTime - period);
        }
    }

}

  TimerTask是實現了Runnable接口的,使用時是使用的Timer類,Java Timer類是線程安全的,多個線程可以共享一個Timer對象,而無需外部同步。使用時需要創建一個Timer對象。

使用實例:

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

public class Test extends TimerTask {
    private String name = "";

    public Test(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println("execute:" + name);
    }

    public static void main(String[] args) {
        Timer timer = new Timer();
        long delay1 = 1 * 1000;
        long period1 = 1000;
        // 從現在開始 1 秒鍾之后,每隔 1 秒鍾執行一次 job1
        timer.schedule(new Test("test.."), delay1, period1);
        long delay2 = 2 * 1000;
        long period2 = 2000;
        // 從現在開始 2 秒鍾之后,每隔 2 秒鍾執行一次 job2
        timer.schedule(new Test("testResult.."), delay2, period2);
    }
}

輸出結果:

 

   Timer類包含幾個schedule()方法,用於安排任務在給定時間或延遲一段時間后運行一次:

public void schedule(TimerTask task, long delay, long period) {
        if (delay < 0)
            throw new IllegalArgumentException("Negative delay.");
        if (period <= 0)
            throw new IllegalArgumentException("Non-positive period.");
        sched(task, System.currentTimeMillis()+delay, -period);
}

  

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM