中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Timer如何實現自定義時間間隔的連環炸

發布時間:2022-01-11 10:21:38 來源:億速云 閱讀:130 作者:iii 欄目:編程語言

這篇文章主要介紹“Timer如何實現自定義時間間隔的連環炸”,在日常操作中,相信很多人在Timer如何實現自定義時間間隔的連環炸問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Timer如何實現自定義時間間隔的連環炸”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

傳統線程技術中有個定時器,定時器的類是 Timer,我們使用定時器的目的就是給它安排任務,讓它在指定的時間完成任務。所以先來看一下 Timer 類中的方法(主要看常用的 TimerTask() 方法):

返回值方法名方法描述
voidschedule(TimerTasktask,longdelay)安排在指定延遲后執行指定的任務。
voidschedule(TimerTasktask,longdelay,longperiod)安排指定的任務從指定的延遲后開始進行重復的固定延遲執行。
voidschedule(TimerTasktask,Datetime)安排在指定的時間執行指定的任務
voidschedule(TimerTasktask,DatefirstTime,longperiod)安排指定的任務在指定的時間開始進行重復的固定延遲執行。

前面兩個是在指定延遲后執行或者重復執行,后面兩個是在指定時間執行或者重復執行。我們以前兩個為例來研究一下定時器的使用。先寫一個簡單的使用定時器的 demo,然后慢慢引申。

public class TraditionalTimer {
    public static void main(String[] args) {
        //簡單定時器的demo
        new Timer().schedule(new TimerTask() {          
            @Override
            public void run() {
                //實際中會扔一個對象進來,我們就可以在這里操作這個對象的所有方法了
                System.out.println("--boom--");//爆炸
            }
        }, 2000,3000); 
        //打印秒鐘,一秒輸出一次,用來方便觀察的
        while(true) {
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

我們用匿名內部類來定義了一個 TimerTask 對象,需要重寫 run() 方法,然后運行這個程序,可以看出來第一次2秒鐘后打印 “--boom--,后面每隔3秒打印一次。
我們也可以自己來實現上面這個重復執行,我們用定時器的 “連環套”!也就是定時器中再套定時器,一個定時器任務執行完了,在任務的最后再裝一個定時器。那么我們需要先定義一個自己的定時器任務,在自己的定時器任務中再裝一個定時器,把自定義的定時器任務扔進去。然后我們開啟定時器的時候把自己定義的定時器任務扔進去即可。如下:

public class TraditionalTimer {
    public static void main(String[] args) {
        //自定義一個定時器任務
        class MyTimerTask extends TimerTask {           
            @Override
            public void run() {
                System.out.println("--boom--");
                //任務執行完再裝一個定時器,扔進自定義的定時器任務
                new Timer().schedule(new MyTimerTask(), 3000);
            }
        }
        new Timer().schedule(new MyTimerTask(), 2000);//外面開啟定時器
        while(true) {//打印秒鐘,一秒輸出一次
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

這樣的話,我們通過定時器的 “連環套” 很輕松的實現了連環爆炸。但是現在問題來了,上面提供的方法中重復執行都是每隔固定的時間,如果我想要隔2秒執行一次,再隔4秒執行一次,再隔2秒執行一次,再隔4秒執行一次……這該如何實現呢?
可以這樣,我們定義一個全局的私有成員變量來記錄爆炸次數,奇數的時候隔2秒炸,偶數的次數的話隔4秒炸,或者反過來也行,修改如下:

public class TraditionalTimer {
    private static int count = 0; //記錄爆炸的次數
    public static void main(String[] args) {    
        class MyTimerTask extends TimerTask {           
            @Override
            public void run() {
                count = (count + 1) % 2; //結果只有0和1
                System.out.println("--boom--");
                                //根據count結果設定新的定時時間
                new Timer().schedule(new MyTimerTask(), 2000+2000*count);
            }
        }
        new Timer().schedule(new MyTimerTask(), 2000);
        while(true) {//打印秒鐘,一秒輸出一次
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

這樣的話,我們就實現了自定義爆炸間隔了。上面這個是通過定義一個全局私有變量來實現,其實我們也可以這么干:不是要實現兩個不同時間間隔的連環炸么?我可以定義兩個定時器任務A和B,在A執行完開啟定時器,把B任務裝進去,B執行完開啟定時器把A裝進去,這樣也可以。如下:

public class TraditionalTimer {
    public static void main(String[] args) {
        new Timer().schedule(new MyTimerTaskA(), 2000);//A和B隨便開一個
        while(true) {//打印秒鐘,一秒輸出一次
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}
//自定義兩個定時器任務類,繼承TimerTask即可
class MyTimerTaskA extends TimerTask {
    @Override
    public void run() {
        System.out.println("--boomA--");
        new Timer().schedule(new MyTimerTaskB(), 4000);
    }           
}
class MyTimerTaskB extends TimerTask {
    @Override
    public void run() {
        System.out.println("--boomB--");
        new Timer().schedule(new MyTimerTaskA(), 2000);
    }   
}

到此,關于“Timer如何實現自定義時間間隔的連環炸”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平乡县| 株洲县| 临清市| 集安市| 关岭| 嵊州市| 蓝田县| 诏安县| 炉霍县| 崇礼县| 来安县| 城口县| 绥阳县| 赤水市| 堆龙德庆县| 琼结县| 石嘴山市| 黔西| 瑞安市| 清新县| 雷州市| 章丘市| 浮梁县| 昔阳县| 南和县| 贺州市| 绍兴市| 澜沧| 华宁县| 新郑市| 忻州市| 都安| 平远县| 阿鲁科尔沁旗| 和平县| 盖州市| 荣昌县| 句容市| 濮阳县| 伊宁县| 大洼县|