我見過很多的程序員,在寫定時任務時,用的方法很原始。其中不乏"歷史悠久"的開發者。他們在處理定時任務時(例如監視系統集羣運行狀態,活着監視緩存集羣的運行狀態),用的方法很簡單,很隨意。這可能是多年來積攢的土辦法。但確實好用--雖然有時候不怎麼可靠。
//這裏可以是一個類,用來封裝任務。下面的例子用來定時執行一個絕對間隔爲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();
}
}
}
//點我停止。停止!
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();
}
}
}
//點我停止。停止!
flag = false;
}
}
終於,又裝了一把。其中TaskExe 爲一個接口。
但通常來說,我們需要的定時任務,不僅僅是一個,可能需要好幾個,這樣的話,可就哭了。我需要寫很多的類。如果有一天,爲了某個需求,需要增加一個定時任務。乖乖,還得改好多代碼。並且如果寫的過於分散,將來幾乎沒有辦法維護。你甚至不知道那個離職的傢伙將代碼寫在了哪裏。即使eclipse有ctrl+h的功能。你也會很鬱悶。這同樣不符合我裝逼的性格。(未完待續)