国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Java定時任務調度工具】Timer

Rindia / 2997人閱讀

摘要:筆記來源定時任務調度基于給定的時間點,給定的時間間隔或者給定的執行次數自動執行的任務。可安排任務執行一次,或者定期重復執行。有且僅有一個后臺線程對多個業務線程進行定時定頻率的調度。

筆記來源:IMOOC Java Timer
定時任務調度

基于給定的時間點給定的時間間隔或者給定的執行次數自動執行的任務。

Timer 定義

一種工具,線程用其安排以后在后臺線程中執行的任務。可安排任務執行一次,或者定期重復執行。

有且僅有一個后臺線程多個業務線程進行定時定頻率的調度

Timer 主要構建

Timer 主要成分

Timer 定時調度函數 schedule 的四種用法

schedule(task, time)

參數

task - 所要安排的任務

time - 執行任務的時間

作用

在時間等于或超過time的時候執行且僅執行一次task

schedule(task, time, period)

參數

task - 所要安排的任務

time - 首次執行任務的時間

period - 執行一次task的時間間隔,單位是毫秒

作用

時間等于或超過time時首次執行task,之后每隔period毫秒重復執行一次task

schedule(task, delay)

參數

task - 所要安排的任務

delay - 執行任務前的延遲時間,單位是毫秒

作用

等待delay毫秒后執行且僅執行一次task

schedule(task, delay, period)

參數

task - 所要安排的任務

delay - 執行任務前的延遲時間,單位是毫秒

period - 執行一次task的時間間隔,單位是毫秒

作用

等待delay毫秒后首次執行task,之后每隔period毫秒重復執行一次task

scheduleAtFixedRate 的兩種用法

scheduleAtFixedRate(task, time, period)

參數

task - 所要安排的任務

time - 首次執行任務的時間

period - 執行一次task的時間間隔,單位是毫秒

作用

時間等于或超過time時首次執行task,之后每隔period毫秒重復執行一次task

scheduleAtFixedRate(task, delay, period)

參數

task - 所要安排的任務

delay - 執行任務前的延遲時間,單位是毫秒

period - 執行一次task的時間間隔,單位是毫秒

作用

等待delay毫秒后首次執行task,之后每隔period毫秒重復執行一次task

Timer 示例
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask {
    private String name;
    public MyTimerTask(String inputName) {
        name = inputName;
    }
    @Override
    public void run() {
        // 以 yyyy-MM-dd HH:mm:ss 的格式打印當前執行時間
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current exec time is: " + sf.format(calendar.getTime()));

        // 打印當前name的內容
        System.out.println("Current exec name is: " + name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;

public class MyTimer {
    public static void main(String[] args) {
        // 1. 創建一個timer實例
        Timer timer = new Timer();
        // 2. 創建一個MyTimerTask實例
        MyTimerTask myTimerTask = new MyTimerTask("No.1");
        /**
         * 獲取當前時間,并設置成距離當前時間三秒后的時間
         */
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current main time is: " + sf.format(calendar.getTime()));
        calendar.add(Calendar.SECOND, 3);
        // 3. 通過timer定時定頻率調用myTimerTask的業務邏輯
        //-------------------schedule的四種用法-------------------//
        /**
         * 在時間等于或超過time的時間執行且僅執行一次task
         */
        myTimerTask.setName("schedule_1");
        timer.schedule(myTimerTask, calendar.getTime());

        /**
         * 時間等于或超過time時首次執行task,之后每隔period毫秒重復執行一次task
         */
        myTimerTask.setName("schedule_2");
        timer.schedule(myTimerTask, calendar.getTime(), 2000);

        /**
         * 等待delay毫秒后執行且僅執行一次task
         */
        myTimerTask.setName("schedule_3");
        timer.schedule(myTimerTask, 1000);

        /**
         * 等待delay毫秒后首次執行task,之后每隔period毫秒重復執行一次task
         */
        myTimerTask.setName("schedule_4");
        timer.schedule(myTimerTask, 3000, 2000);

        //--------------scheduleAtFixedRate的兩種用法-------------//
        /**
         * 時間等于或超過time時首次執行task,之后每隔period毫秒重復執行一次task
         */
        myTimerTask.setName("scheduleAtFixedRate_1");
        timer.scheduleAtFixedRate(myTimerTask, calendar.getTime(), 2000);

        /**
         * 等待delay毫秒后首次執行task,之后每隔period毫秒重復執行一次task
         */
        myTimerTask.setName("scheduleAtFixedRate_2");
        timer.scheduleAtFixedRate(myTimerTask, 3000, 2000);
    }
}
schedule 與 scheduleAtFixedRate 的區別 首次計劃執行的時間早于當前的時間

schedule 方法

fixed-delay;如果第一次執行時間被 delay 了,隨后的執行時間按照上一次實際執行完成的時間點進行計算

scheduleAtFixedRate 方法

fixed-rate;如果第一次執行時間被 delay 了,隨后的執行時間按照上一次開始的時間點進行計算,并且為了趕上進度會多次執行任務,因此 TimerTask 中的執行體需要考慮同步

任務執行所需時間超出任務的執行周期間隔

schedule 方法

下一次執行時間相對于上一次實際執行完成的時間點,因此執行時間會不斷延后

scheduleAtFixedRate 方法

下一次執行時間相對于上一次開始的時間點,因此執行時間一般不會延后,因此存在并發性

其他重要函數

TimerTaskcancel()scheduleExecutionTime()

Timercancel()purge()

TimerTask 的兩個重要函數

cancel()

作用:取消當前 TimerTask 里的任務

scheduleExecutionTime()

作用:返回此任務最近實際執行的已安排執行的實際

返回:最近發生此任務執行安排的時間,為Long類型

Timer 的其他函數

cancel()

終止此計時器,丟棄所有當前已安排的任務

purge()

作用:從此計時器的任務隊列中移除所有已取消的任務

返回:從隊列中移除的任務數

Timer 函數的綜合應用

模擬兩個機器人的定時行為

第一個機器人會隔兩秒打印最近一次計劃的時間、執行內容

第二個機器人會模擬往桶里倒水,直到桶里的水滿為止,然后停止工作

桶里的水滿了之后,第一個機器人再跳舞兩秒鐘,然后停止工作

/**
 * 跳舞的機器人
 */
public class DancingRobot extends TimerTask {
    @Override
    public void run() {
        // 獲取最近的一次任務執行的時間,并將其格式化
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Scheduled exec time is: " + sf.format(scheduledExecutionTime()));
        System.out.println("Dancing happily!");
    }
}

/**
 * 倒水的機器人
 */
public class WaterRobot extends TimerTask {
    private Timer timer;
    // 最大容量為5L
    private Integer bucketCapacity = 0;
    public WaterRobot(Timer inputTimer) {
        timer = inputTimer;
    }
    @Override
    public void run() {
        // 灌水直接至桶滿為止
        if(bucketCapacity < 5){
            System.out.println("Add 1L water into the bucket!");
            bucketCapacity ++;
        } else {
            // 水滿之后就停止執行
            System.out.println("The number of canceled task in timer is: " + timer.purge());
            cancel();
            System.out.println("The waterRobot has been aborted");
            System.out.println("The number of canceled task in timer is: " + timer.purge());
            System.out.println("Current water is " + bucketCapacity + "L");
            // 等待兩秒鐘,終止timer里面的所有內容
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            timer.cancel();
        }
    }
}

public class Executor {
    public static void main(String[] args) {
        Timer timer = new Timer();
        // 獲取當前時間
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current time is: " + sf.format(calendar.getTime()));

        DancingRobot dr = new DancingRobot();
        WaterRobot wr = new WaterRobot(timer);

        timer.schedule(dr, calendar.getTime(), 2000);
        timer.scheduleAtFixedRate(wr, calendar.getTime(), 1000);
    }
}
Timer 的缺陷

管理并發任務的缺陷

Timer 有且只有一個線程去執行定時任務,如果存在多個任務,且任務時間過長,會導致執行效果與預期不符

當任務拋出異常時的缺陷

如果 TimerTask 拋出 RuntimeException,Timer 會停止所有任務的運行

Timer 的使用禁區

對時效性要求較高的多任務并發作業

對復雜的任務的調度

擴展閱讀

Timer與ScheduledExecutorService間的抉擇

Java中定時任務的實現:Timer與ScheduledExecutorService的不同

Java 幾種調度任務的Timer、ScheduledExecutor、 開源工具包 Quartz、開源工具包 JCronTab

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71653.html

相關文章

  • 慕課網_《Java定時任務調度工具詳解之Timer篇》學習總結

    時間:2017年05月24日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:無個人學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時任務調度 基于給定的時間點,給定的時間間隔或者給定的執行次數自動執行的任務 在Java中的定時調度工具 Timer:小弟,能實現日常60%的定...

    wind5o 評論0 收藏0
  • 那些年,我們追過的“定時調度

    摘要:類是一個抽象類,由安排為一次執行或重復執行的任務。也是自帶的一個基于線程池設計的定時任務類。問題,則可以直接使用類實現自定義的定時調度規則。 定時調度作為后端開發人員,我們總會遇到這樣的業務場景:每周同步一批數據;每半個小時檢查一遍服務器運行狀況;每天早上八點給用戶發送一份包含今日待辦事項的郵件,等等。 這些場景中都離不開定時器,就像一個定好時間規則的鬧鐘,它會在指定時間觸發,執行我們...

    The question 評論0 收藏0

發表評論

0條評論

Rindia

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<