Java并发基础02. 传统线程技术中的定时器技术
傳統線程技術中有個定時器,定時器的類是Timer,我們使用定時器的目的就是給它安排任務,讓它在指定的時間完成任務。所以先來看一下Timer類中的方法(主要看常用的TimerTask()方法):
前面兩個是在指定延遲后執行或者重復執行,后面兩個是在指定時間執行或者重復執行。我們以前兩個為例來研究一下定時器的使用。
先寫一個簡單的使用定時器的demo,然后慢慢引申。
我們用匿名內部類來定義了一個TimerTask對象,需要重寫run()方法,然后運行這個程序,可以看出來第一次2秒鐘后打印“--boom--,后面每隔3秒打印一次。
我們也可以自己來實現上面這個重復執行,我們用定時器的“連環套”!也就是定時器中再套定時器,一個定時器任務執行完了,在任務的最后再裝一個定時器。那么我們需要先定義一個自己的定時器任務,在自己的定時器任務中再裝一個定時器,把自定義的定時器任務扔進去。然后我們開啟定時器的時候把自己定義的定時器任務扔進去即可。如下:
這樣的話,我們通過定時器的“連環套”很輕松的實現了連環爆炸。但是現在問題來了,上面提供的方法中重復執行都是每隔固定的時間,如果我想要隔2秒執行一次,再隔4秒執行一次,再隔2秒執行一次,再隔4秒執行一次……這該如何實現呢?
可以這樣,我們定義一個全局的私有成員變量來記錄爆炸次數,奇數的時候隔2秒炸,偶數的次數的話隔4秒炸,或者反過來也行,修改如下:
這樣的話,我們就實現了自定義爆炸間隔了。上面這個是通過定義一個全局私有變量來實現,其實我們也可以這么干:不是要實現兩個不同時間間隔的連環炸么?我可以定義兩個定時器任務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 {@Overridepublic void run() {System.out.println("--boomA--");new Timer().schedule(new MyTimerTaskB(), 4000);} } class MyTimerTaskB extends TimerTask {@Overridepublic void run() {System.out.println("--boomB--");new Timer().schedule(new MyTimerTaskA(), 2000);} }這樣就可以實現自定義時間間隔的連環炸了。傳統的定時器技術就總結這么多吧~
更多優質文章和資源,請關注公眾號:【程序員私房菜】。
轉載于:https://www.cnblogs.com/eson15/p/9824647.html
總結
以上是生活随笔為你收集整理的Java并发基础02. 传统线程技术中的定时器技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zabbix Server安装
- 下一篇: Java泛型通用常量类案例