溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Timer如何實(shí)現(xiàn)自定義時(shí)間間隔的連環(huán)炸

發(fā)布時(shí)間:2022-01-11 10:21:38 來源:億速云 閱讀:122 作者:iii 欄目:編程語言

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

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

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

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

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

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

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

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

public class TraditionalTimer {
    private static int count = 0; //記錄爆炸的次數(shù)
    public static void main(String[] args) {    
        class MyTimerTask extends TimerTask {           
            @Override
            public void run() {
                count = (count + 1) % 2; //結(jié)果只有0和1
                System.out.println("--boom--");
                                //根據(jù)count結(jié)果設(shè)定新的定時(shí)時(shí)間
                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();
            }
        }
    }
}

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

public class TraditionalTimer {
    public static void main(String[] args) {
        new Timer().schedule(new MyTimerTaskA(), 2000);//A和B隨便開一個(gè)
        while(true) {//打印秒鐘,一秒輸出一次
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}
//自定義兩個(gè)定時(shí)器任務(wù)類,繼承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);
    }   
}

到此,關(guān)于“Timer如何實(shí)現(xiàn)自定義時(shí)間間隔的連環(huán)炸”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI