Timer是一種線程設施,用於安排之後在後臺線程中執行的任務。可安排任務執行一次,或者按期重複執行,能夠當作一個定時器,能夠調度TimerTask。TimerTask是一個抽象類,實現了Runnable接口,因此具有了多線程的能力。 java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import
java
.
util
.
TimerTask
;
public
class
MyTask
extends
TimerTask
{
private
int
id
;
public
MyTask
(
int
id
)
{
this
.
id
=
id
;
}
public
void
run
(
)
{
System
.
out
.
println
(
"線程"
+
id
+
":正在執行"
)
;
//System.gc();
}
}
|
而後主程序代碼爲: 多線程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import
java
.
util
.
Date
;
import
java
.
util
.
Timer
;
public
class
Test
{
public
static
void
main
(
String
[
]
args
)
{
Timer
timer
=
new
Timer
(
)
;
timer
.
schedule
(
new
MyTask
(
1
)
,
5000
)
;
// 5秒後啓動任務
MyTask
secondTask
=
new
MyTask
(
2
)
;
timer
.
schedule
(
secondTask
,
1000
,
3000
)
;
// 1秒後啓動任務,之後每隔3秒執行一次線程
Date
date
=
new
Date
(
)
;
timer
.
schedule
(
new
MyTask
(
3
)
,
new
Date
(
date
.
getTime
(
)
+
1000
)
)
;
// 以date爲參數,指定某個時間點執行線程
// timer.cancel();
// secondTask.cancel();
System
.
out
.
println
(
"main thread 結束!"
)
;
}
}
|
Timer裏面有4個schedule重載函數,並且還有兩個scheduleAtFixedRate:
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任務在指定的時間開始進行重複的固定速率執行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任務在指定的延遲後開始進行重複的固定速率執行。
使用scheduleAtFixedRate的話,Timer會盡可能的讓任務在一個固定的頻率下運行。例如:在上面的例子中,讓secondTask在1秒鐘後,每3秒鐘執行一次,可是由於java不是實時的,因此,咱們在上個程序中表達的原義並不可以嚴格執行,例若有時可能資源調度緊張4秒之後才執行下一次,有時候又3.5秒執行。若是咱們調用的是scheduleAtFixedRate,那麼Timer會盡可能讓你的secondTask執行的頻率保持在3秒一次。運行上面的程序,假設使用的是scheduleAtFixedRate,那麼下面的場景就是可能的:1秒鐘後,secondTask執行一次,由於系統繁忙,以後的3.5秒後secondTask才得以執行第二次,而後Timer記下了這個延遲,並嘗試在下一個任務的時候彌補這個延遲,那麼2.5秒後,secondTask將執行的三次。「以固定的頻率而不是固定的延遲時間去執行一個任務」就是這個意思。
Timer終止的問題:
默認狀況下,只要一個程序的timer線程在運行,那麼這個程序就會保持運行。能夠經過如下3種方法終止一個timer線程:
(1)調用timer的cancle方法。你能夠從程序的任何地方調用此方法,甚至在一個timer task的run方法裏;
(2)讓timer線程成爲一個daemon線程(能夠在建立timer時使用new Timer(true)達到這個目地),這樣當程序只有daemon線程的時候,它就會自動終止運行;
(3)調用System.exit方法,使整個程序(全部線程)終止。
TimerTask也有cancel方法。
上面所說的「只要一個程序的timer線程在運行,那麼這個程序就會保持運行」。那麼反過來,若是Timer裏的全部TimerTask都執行完了,整個程序會退出嗎,經測試是否認的,例如上面的測試代碼,若是隻加第一個TimerTask在Timer中執行:
timer.schedule(new MyTask(1), 5000);// 5秒後啓動任務
那麼5秒之後,其實整個程序仍是沒有退出,Timer會等待垃圾回收的時候被回收掉而後程序會得以退出,可是多長時間呢?在TimerTask的run函數執行完之後加上System.gc();就能夠了。 ide
Timer類是一種線程設施,能夠用來實現某一個時間或某一段時間後安排某一個任務執行一次或按期重複執行。該功能和TimerTask配合使用。TimerTask類用於實現由Timer安排的一次或重複執行的某個任務。每個Timer對象對應的是一個線程,所以計時器所執行的任務應該迅速完成,不然會延遲後續的任務執行。
Timer類方法摘要
函數