Java 實現定時器ScheduledThreadPoolExecutor

來源:互聯網
上載者:User

標籤:

Java 實現定時器ScheduledThreadPoolExecutor

延遲任務:在100秒後執行該任務

周期任務:每10秒執行一次任務

Timer存在一些缺陷,應該考慮使用ScheduleThreadPoolExecutor 來代替他。

可以通過ScheduleThreadPoolExecutor 的建構函式或Executors 的 newScheduleThreadPool  Factory 方法來建立該類的對象。

Timer在執行所有定時任務時只會建立一個線程。如果某個任務執行時間過長,那麼將破壞其他TimerTask的定時精確性。

Timer另一個問題是如果TimeTask拋出了一個未檢查的異常,那麼Timer將表現出槽糕的行為。Timer線程並不捕獲異常,因此

當TimerTask拋出未檢查的異常時將終止定時線程。這種情況下,Timer也不會恢複線程的執行,而是會錯誤地認為整個Timer都消失了。

因此,已經被調度但尚未執行的TimerTask將不會再執行,新的任務也不會被調度。這就是線程泄漏。


ScheduledThreadPoolExecutor繼承結構


延遲和周期任務的執行

如下程式碼片段

package com.usoft.schedule;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;/** * @author: Lenovo(2015-08-13 23:54) */public class ScheduledTest {    public static void main(String args[]) throws ExecutionException, InterruptedException {        ScheduledExecutorService schedule = Executors                .newScheduledThreadPool(2);        /**         * 延遲1秒執行任務一次         */        schedule.schedule(new Runnable() {            @Override            public void run() {                System.out.println("hello world runnable");            }        }, 1000, TimeUnit.MILLISECONDS);        /**         * 延遲2秒執行任務一次         */        Future result = schedule.schedule(new Callable<String>() {            @Override            public String call() throws Exception {                return "hello world callable";            }        }, 2000, TimeUnit.MILLISECONDS);        System.out.println(result.get());        // 以固定的頻率來周期的執行任務        schedule.scheduleAtFixedRate(new Runnable() {            @Override            public void run() {                System.out.println("定時周期任務執行");            }        }, 1000, 2000, TimeUnit.MILLISECONDS);        // 以固定的延遲來周期的執行任務        schedule.scheduleWithFixedDelay(new Runnable() {            @Override            public void run() {                System.out.println("定時周期任務執行");            }        }, 1000, 3000, TimeUnit.MILLISECONDS);        // 關閉定時和周期任務的執行        Thread.sleep(1000 * 10);        schedule.shutdown();        System.out.println("pool shutdown:" + schedule.isShutdown());        while (!schedule.isTerminated()) {            schedule.awaitTermination(1, TimeUnit.SECONDS);        }    }}


定時任務的執行

要說定時任務,其實都是用延遲任務和周期任務來實現定時的。

比如說,我要在每天的中午12點啟動一個定時任務,就要根據當前程式的啟動時間來算出延遲多長時間來執行這個任務,並且是周期的執行,有一個固定的演算法來算出延遲的時間長度。

package com.usoft.schedule;import java.util.Calendar;public class Main23 {    private static final int period = 1000 * 60; //秒    private static final int one_day_millseconds = 24 * 60 * 60 * 1000;    public static void main(String args[]) {        int dayOfHour = 0; // 24h 制        int minute = 0;        int second = 0;        long delay;  //首次執行任務的延遲        Calendar c = Calendar.getInstance();        long currentTime = c.getTimeInMillis();        c.set(Calendar.HOUR_OF_DAY, dayOfHour);        c.set(Calendar.MINUTE, minute);        c.set(Calendar.SECOND, second);        long executeTime = c.getTimeInMillis();        delay = executeTime - currentTime < 0 ? (executeTime - currentTime + one_day_millseconds)            : (executeTime - currentTime);        System.out.println("DelayTimeInMillis =" + delay);        System.out.println("DelayTimeInSecond =" + delay / 1000);        System.out.println("DelayTimeInHour =" + delay / (1000 * 60 * 60));    }}

這裡簡單的指定小時分鐘和秒,也就說當到了這個時刻就要周期的執行這個任務。那麼要延遲多長時間執行這個任務就可以根據以上代碼來算出來。

也可以選擇不是周期的執行任務,只是在這個時刻執行一次任務。

====================END====================

Java 實現定時器ScheduledThreadPoolExecutor

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.