定時任務(2)--最原始的實現

我見過很多的程序員,在寫定時任務時,用的方法很原始。其中不乏"歷史悠久"的開發者。他們在處理定時任務時(例如監視系統集羣運行狀態,活着監視緩存集羣的運行狀態),用的方法很簡單,很隨意。這可能是多年來積攢的土辦法。但確實好用--雖然有時候不怎麼可靠。


土辦法的實現很簡單。就是單獨啓用一個線程,通過線程睡眠的方式。讓線程(攜帶任務)定時運行。多說無益,直接上代碼。
//這裏可以是一個類,用來封裝任務。下面的例子用來定時執行一個絕對間隔爲2s的定時任務。
    class PrintThreade implements Runnable{
        public void run() {
            while(true){
                System.out.println("====");
                try {
                    Thread.currentThread().sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

最初看到的時候,我一個驚嚇,我會想:Oh,My God! 這個定時任務如何停止呢。任務一開始,就相當於吃了炫邁,根本停不下來。稍加分析就知道,停下它的根本在於控制循環條件。
如果能通過將循環條件改爲布爾變量。還可以通過在類的外部,控制任務的終止。爲定時任務添加了"Stop"按鈕。如下

    class PrintThreade implements Runnable{
        private boolean flag = false;
        
        public void run() {
            flag = true;
            while(flag){
                System.out.println("====");
                try {
                    Thread.currentThread().sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }

//點我停止。停止!

        public void stop(){
            flag = false;
        }
    }
java封裝的特性告訴我,這位小哥,你不能這麼寫代碼。你會被笑話爲新人的,這不符合你裝逼的個性。你得將定時任務分解爲定時任務調度器和定時任務實現類。好吧,這不符合我裝逼的個性。我得接着改。
    class PrintThreade implements Runnable{
        private boolean flag = false;
        
        TaskExe ta = new TaskExe() {
            public void doSomeThing() {
                //拜託,做點讓我開心的。別總是輸出了。
            }
        };
        
        public void run() {
            flag = true;
            while(flag){
                //所有的任務執行,只有一行,清晰明瞭。
                ta.doSomeThing();
                try {
                    Thread.currentThread().sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }

         //點我停止。停止!

        public void stop(){
            flag = false;
        }
    }
終於,又裝了一把。其中TaskExe 爲一個接口。
但通常來說,我們需要的定時任務,不僅僅是一個,可能需要好幾個,這樣的話,可就哭了。我需要寫很多的類。如果有一天,爲了某個需求,需要增加一個定時任務。乖乖,還得改好多代碼。並且如果寫的過於分散,將來幾乎沒有辦法維護。你甚至不知道那個離職的傢伙將代碼寫在了哪裏。即使eclipse有ctrl+h的功能。你也會很鬱悶。這同樣不符合我裝逼的性格。(未完待續)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章