亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【Java定時(shí)任務(wù)調(diào)度工具】Timer

Rindia / 3063人閱讀

摘要:筆記來(lái)源定時(shí)任務(wù)調(diào)度基于給定的時(shí)間點(diǎn),給定的時(shí)間間隔或者給定的執(zhí)行次數(shù)自動(dòng)執(zhí)行的任務(wù)。可安排任務(wù)執(zhí)行一次,或者定期重復(fù)執(zhí)行。有且僅有一個(gè)后臺(tái)線程對(duì)多個(gè)業(yè)務(wù)線程進(jìn)行定時(shí)定頻率的調(diào)度。

筆記來(lái)源:IMOOC Java Timer
定時(shí)任務(wù)調(diào)度

基于給定的時(shí)間點(diǎn),給定的時(shí)間間隔或者給定的執(zhí)行次數(shù)自動(dòng)執(zhí)行的任務(wù)。

Timer 定義

一種工具,線程用其安排以后在后臺(tái)線程中執(zhí)行的任務(wù)??砂才湃蝿?wù)執(zhí)行一次,或者定期重復(fù)執(zhí)行。

有且僅有一個(gè)后臺(tái)線程對(duì)多個(gè)業(yè)務(wù)線程進(jìn)行定時(shí)定頻率的調(diào)度

Timer 主要構(gòu)建

Timer 主要成分

Timer 定時(shí)調(diào)度函數(shù) schedule 的四種用法

schedule(task, time)

參數(shù)

task - 所要安排的任務(wù)

time - 執(zhí)行任務(wù)的時(shí)間

作用

在時(shí)間等于或超過(guò)time的時(shí)候執(zhí)行且僅執(zhí)行一次task

schedule(task, time, period)

參數(shù)

task - 所要安排的任務(wù)

time - 首次執(zhí)行任務(wù)的時(shí)間

period - 執(zhí)行一次task的時(shí)間間隔,單位是毫秒

作用

時(shí)間等于或超過(guò)time時(shí)首次執(zhí)行task,之后每隔period毫秒重復(fù)執(zhí)行一次task

schedule(task, delay)

參數(shù)

task - 所要安排的任務(wù)

delay - 執(zhí)行任務(wù)前的延遲時(shí)間,單位是毫秒

作用

等待delay毫秒后執(zhí)行且僅執(zhí)行一次task

schedule(task, delay, period)

參數(shù)

task - 所要安排的任務(wù)

delay - 執(zhí)行任務(wù)前的延遲時(shí)間,單位是毫秒

period - 執(zhí)行一次task的時(shí)間間隔,單位是毫秒

作用

等待delay毫秒后首次執(zhí)行task,之后每隔period毫秒重復(fù)執(zhí)行一次task

scheduleAtFixedRate 的兩種用法

scheduleAtFixedRate(task, time, period)

參數(shù)

task - 所要安排的任務(wù)

time - 首次執(zhí)行任務(wù)的時(shí)間

period - 執(zhí)行一次task的時(shí)間間隔,單位是毫秒

作用

時(shí)間等于或超過(guò)time時(shí)首次執(zhí)行task,之后每隔period毫秒重復(fù)執(zhí)行一次task

scheduleAtFixedRate(task, delay, period)

參數(shù)

task - 所要安排的任務(wù)

delay - 執(zhí)行任務(wù)前的延遲時(shí)間,單位是毫秒

period - 執(zhí)行一次task的時(shí)間間隔,單位是毫秒

作用

等待delay毫秒后首次執(zhí)行task,之后每隔period毫秒重復(fù)執(zhí)行一次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 的格式打印當(dāng)前執(zhí)行時(shí)間
        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()));

        // 打印當(dāng)前name的內(nèi)容
        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. 創(chuàng)建一個(gè)timer實(shí)例
        Timer timer = new Timer();
        // 2. 創(chuàng)建一個(gè)MyTimerTask實(shí)例
        MyTimerTask myTimerTask = new MyTimerTask("No.1");
        /**
         * 獲取當(dāng)前時(shí)間,并設(shè)置成距離當(dāng)前時(shí)間三秒后的時(shí)間
         */
        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. 通過(guò)timer定時(shí)定頻率調(diào)用myTimerTask的業(yè)務(wù)邏輯
        //-------------------schedule的四種用法-------------------//
        /**
         * 在時(shí)間等于或超過(guò)time的時(shí)間執(zhí)行且僅執(zhí)行一次task
         */
        myTimerTask.setName("schedule_1");
        timer.schedule(myTimerTask, calendar.getTime());

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

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

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

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

        /**
         * 等待delay毫秒后首次執(zhí)行task,之后每隔period毫秒重復(fù)執(zhí)行一次task
         */
        myTimerTask.setName("scheduleAtFixedRate_2");
        timer.scheduleAtFixedRate(myTimerTask, 3000, 2000);
    }
}
schedule 與 scheduleAtFixedRate 的區(qū)別 首次計(jì)劃執(zhí)行的時(shí)間早于當(dāng)前的時(shí)間

schedule 方法

fixed-delay;如果第一次執(zhí)行時(shí)間被 delay 了,隨后的執(zhí)行時(shí)間按照上一次實(shí)際執(zhí)行完成的時(shí)間點(diǎn)進(jìn)行計(jì)算

scheduleAtFixedRate 方法

fixed-rate;如果第一次執(zhí)行時(shí)間被 delay 了,隨后的執(zhí)行時(shí)間按照上一次開(kāi)始的時(shí)間點(diǎn)進(jìn)行計(jì)算,并且為了趕上進(jìn)度會(huì)多次執(zhí)行任務(wù),因此 TimerTask 中的執(zhí)行體需要考慮同步

任務(wù)執(zhí)行所需時(shí)間超出任務(wù)的執(zhí)行周期間隔

schedule 方法

下一次執(zhí)行時(shí)間相對(duì)于上一次實(shí)際執(zhí)行完成的時(shí)間點(diǎn),因此執(zhí)行時(shí)間會(huì)不斷延后

scheduleAtFixedRate 方法

下一次執(zhí)行時(shí)間相對(duì)于上一次開(kāi)始的時(shí)間點(diǎn),因此執(zhí)行時(shí)間一般不會(huì)延后,因此存在并發(fā)性

其他重要函數(shù)

TimerTaskcancel()、scheduleExecutionTime()

Timercancel()、purge()

TimerTask 的兩個(gè)重要函數(shù)

cancel()

作用:取消當(dāng)前 TimerTask 里的任務(wù)

scheduleExecutionTime()

作用:返回此任務(wù)最近實(shí)際執(zhí)行的已安排執(zhí)行的實(shí)際

返回:最近發(fā)生此任務(wù)執(zhí)行安排的時(shí)間,為L(zhǎng)ong類型

Timer 的其他函數(shù)

cancel()

終止此計(jì)時(shí)器,丟棄所有當(dāng)前已安排的任務(wù)

purge()

作用:從此計(jì)時(shí)器的任務(wù)隊(duì)列中移除所有已取消的任務(wù)

返回:從隊(duì)列中移除的任務(wù)數(shù)

Timer 函數(shù)的綜合應(yīng)用

模擬兩個(gè)機(jī)器人的定時(shí)行為

第一個(gè)機(jī)器人會(huì)隔兩秒打印最近一次計(jì)劃的時(shí)間、執(zhí)行內(nèi)容

第二個(gè)機(jī)器人會(huì)模擬往桶里倒水,直到桶里的水滿為止,然后停止工作

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

/**
 * 跳舞的機(jī)器人
 */
public class DancingRobot extends TimerTask {
    @Override
    public void run() {
        // 獲取最近的一次任務(wù)執(zhí)行的時(shí)間,并將其格式化
        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!");
    }
}

/**
 * 倒水的機(jī)器人
 */
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 {
            // 水滿之后就停止執(zhí)行
            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里面的所有內(nèi)容
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            timer.cancel();
        }
    }
}

public class Executor {
    public static void main(String[] args) {
        Timer timer = new Timer();
        // 獲取當(dāng)前時(shí)間
        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 的缺陷

管理并發(fā)任務(wù)的缺陷

Timer 有且只有一個(gè)線程去執(zhí)行定時(shí)任務(wù),如果存在多個(gè)任務(wù),且任務(wù)時(shí)間過(guò)長(zhǎng),會(huì)導(dǎo)致執(zhí)行效果與預(yù)期不符

當(dāng)任務(wù)拋出異常時(shí)的缺陷

如果 TimerTask 拋出 RuntimeException,Timer 會(huì)停止所有任務(wù)的運(yùn)行

Timer 的使用禁區(qū)

對(duì)時(shí)效性要求較高的多任務(wù)并發(fā)作業(yè)

對(duì)復(fù)雜的任務(wù)的調(diào)度

擴(kuò)展閱讀

Timer與ScheduledExecutorService間的抉擇

Java中定時(shí)任務(wù)的實(shí)現(xiàn):Timer與ScheduledExecutorService的不同

Java 幾種調(diào)度任務(wù)的Timer、ScheduledExecutor、 開(kāi)源工具包 Quartz、開(kāi)源工具包 JCronTab

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71653.html

相關(guān)文章

  • 慕課網(wǎng)_《Java定時(shí)任務(wù)調(diào)度工具詳解之Timer篇》學(xué)習(xí)總結(jié)

    時(shí)間:2017年05月24日星期三說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無(wú)個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時(shí)任務(wù)調(diào)度 基于給定的時(shí)間點(diǎn),給定的時(shí)間間隔或者給定的執(zhí)行次數(shù)自動(dòng)執(zhí)行的任務(wù) 在Java中的定時(shí)調(diào)度工具 Timer:小弟,能實(shí)現(xiàn)日常60%的定...

    wind5o 評(píng)論0 收藏0
  • 那些年,我們追過(guò)的“定時(shí)調(diào)度

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

    The question 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<