在學習「定時器」之前,我們先來清楚的了解定時器的應用需求,或者場合。當需要在一段規定的時間內完成某些操作時,就需要有乙個精準的定時工具來提醒你更好的去完成。
我自己理解的是「定時」是,在規定好的時間一旦到了,就自動「醒來」一次,當然,可以給這個過程啟動乙個執行緒。我覺得他更多起到的是乙個「提醒」的作用,跟你本身用定時器去做什麼,或者還有能不能在定時器規定的時間內完成你的任務,跟這些都沒有關係。了解了這些基本知識之後就來具體通過乙個簡單例子來說明定時器的作用;
首先,定時器工作需要的屬性有時延,要開啟乙個執行緒協助在一定時間段到了「醒來」,還需要有volatile型別的goon控制程序的執行,此外考慮到在定時期間要做一件事不能被其他的事務干擾,因為還需要設定乙個鎖lock,保證一件事能夠正常的完成。下面來分析**;
public
abstract
class
******didadida
implements
runnable
public
******didadida
(long delay)
public
abstract
void
doing()
;public
void
start()
this
.goon =
true
;new
thread
(this).
start()
;}public
void
stop()
this
.goon =
false;}
@override
public
void
run(
)catch
(interruptedexception e)}}
}}
上述寫到一旦開始定時,就開啟乙個執行緒,執行緒中用到了是「鎖「,每」沉睡「一段時間就去做某件事,這裡做一件事用到了抽象方法,也就是說現在不需要馬上確定要做的事具體是啥,可以在它的實現類中再去完成方法的具體操作。但是實際上上述的方法存在一定的缺陷,先執行緒中的doing()方法執行會占用一定的時間,導致定時不夠」精準「,所以需要改進,可以把doing()要做的事當成乙個執行緒來,在定時」醒來「時要開始做某件事,直接開啟做這件事的執行緒,緊接著就進行後續的操作,這樣作最大程度的避免了完成事件所占用的時間,讓定時更精準。下面是改進的部分;
@override
public
void
run(
)catch
(interruptedexception e)}}
}private
class
innerworker
implements
runnable
@override
public
void
run(
)}
下面給出上述抽象類的實現類,需要實現抽象類中未實現的方法doing(),在這我們只是給出了乙個簡單的例子,來實現定時器的「定時」功能,定時期間要做的事只是簡單的輸出此刻的系統時間,為了更方便理解,還輸出了每一次的開始和結束,下面來看具體的**;
public
class
demodidadida
catch
(interruptedexception e)
system.out.
println
("第"
+t+"次結束:"
+system.
currenttimemillis()
);}}
;}public
void
runup()
catch
(interruptedexception e)
******didadida.
stop()
;}}
注:wait()和sleep()的區別;wait()屬於object類,呼叫wait()方法相當於釋放了「鎖」,此時其他執行緒可以繼續使用,wait()和notofy()針對兩個執行緒互斥;sleep()屬於thread類,呼叫sleep()方法並沒有釋放鎖,此時其他執行緒不可以繼續使用。由於在上述例子中只有乙個主要執行緒,所以在這裡用wait()或者用sleep()都是可以的,但是其他多執行緒的情況下,就需要考慮清楚了,個人認為用wait()比較合適。
下面來看一下最終的執行結果:
第1次開始:1585904659287
第2次開始:1585904659787
第1次結束:1585904660287
第3次開始:1585904660287
第4次開始:1585904660786
第2次結束:1585904660787
第3次結束:1585904661291
第5次開始:1585904661292
第4次結束:1585904661790
第6次開始:1585904661797
第7次開始:1585904662290
第5次結束:1585904662292
第8次開始:1585904662791
第6次結束:1585904662797
第7次結束:1585904663290
第9次開始:1585904663290
第8次結束:1585904663791
第10次開始:1585904663792
第9次結束:1585904664292
第10次結束:1585904664802
這裡需要進一步說明的是,
定時器只具有「定時」的功能,並不能確保在規定的時間內就一定能夠完成你要做的事,定時器不管你有沒有做完你的事,它還是繼續進行定時,只要時間一到就「醒來」。上面的執行結果清楚的表現了每一次開始和結束的時間,可以看出某一次事件還沒完成的時候,下一次事件就有可能開始,它的執行順序並不是一定規律的。
以上是對定時器的簡單實現,主要是理解定時器的工作原理以及功能。
關於定時器
定時器是個很有意思的東西,它很有用,但我認為這不是現代計算機的結構所擅長的事情。計算機適合做那些很大量的簡單重複工作,或者根據請求做出回應。dos時代是沒有程序執行緒等概念的,那時候要想做到定時真是有些麻煩 通常的做法是死迴圈不斷監測時間,發現時間到了就做特定的事情 當然你可以用delay,來指定等...
關於定時器
今天突然想到乙個問題,如果要設定乙個5分鐘的定時器,那麼時間使用5 minute和5 60 second有什麼區別呢?或者說,設定成後者,程式會不會更累呢,會不會每秒鐘都去檢查下是不是到期了?於是去翻了一下golang原始碼中time的newtimer部分,如下 原來人家這兒用的是duration,...
關於 時間和定時器
這些東西 本來感覺沒有什麼搞得必要 但是 感覺很多書 都介紹了一些 我也就跟著做一下吧。獲取系統的時間 這個 應該是是最簡單的 直接看 就ok include stdafx.h include int tmain int argc,tchar ar 關於 systemtime 這個結構體 可以直接看...