java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园
定時器的應用
1、? 定時器主要涉及到兩個類(java.util包中)
@-》public class Timer extendsObject
(一種工具,線程用其安排以后在后臺線程中執行的任務。可安排任務執行一次,或者定期重復執行。 )
@-->public abstract class TimerTask extendsObjectimplementsRunnable
(由 Timer 安排為一次執行或重復執行的任務。)
2、Timer類的構造方法:
構造方法摘要
String?name)
創建一個新計時器,其相關的線程具有指定的名稱。
String?name, boolean?isDaemon)
創建一個新計時器,其相關的線程具有指定的名稱,并且可以指定作為守護程序運行。
與每個 Timer 對象相對應的是單個后臺線程,用于順序地執行所有計時器任務。
計時器任務應該迅速完成。如果完成某個計時器任務的時間太長,那么它會“獨占”計時器的任務執行線程。因此,這就可能延遲后續任務的執行,而這些任務就可能“堆在一起”,并且在上述不友好的任務最終完成時才能夠被快速連續地執行。
對 Timer 對象最后的引用完成后,并且 所有未處理的任務都已執行完成后,計時器的任務執行線程會正常終止(并且成為垃圾回收的對象)。但是這可能要很長時間后才發生。
默認情況下,任務執行線程并不作為守護線程 來運行,所以它能夠阻止應用程序終止。如果調用者想要快速終止計時器的任務執行線程,那么調用者應該調用計時器的
cancel 方法。
如果意外終止了計時器的任務執行線程,例如調用了它的 stop 方法,那么所有以后對該計時器安排任務的嘗試都將導致
IllegalStateException,就好像調用了計時器的 cancel 方法一樣。
此類是線程安全的:多個線程可以共享單個
Timer 對象而無需進行外部同步。
此類不 提供實時保證:它使用 Object.wait(long) 方法來安排任務。
實現注意事項:此類可擴展到大量同時安排的任務(存在數千個都沒有問題)。在內部,它使用二進制堆來表示其任務隊列,所以安排任務的開銷是 O(log n),其中 n 是同時安排的任務數。
實現注意事項:所有構造方法都啟動計時器線程。
方法摘要
void
int
void
TimerTask?task,
Date?time)
安排在指定的時間執行指定的任務。
void
TimerTask?task,
Date?firstTime, long?period)
安排指定的任務在指定的時間開始進行重復的固定延遲執行。
void
TimerTask?task, long?delay)
安排在指定延遲后執行指定的任務。
void
TimerTask?task, long?delay, long?period)
安排指定的任務從指定的延遲后開始進行重復的固定延遲執行。
void
TimerTask?task,
Date?firstTime, long?period)
安排指定的任務在指定的時間開始進行重復的固定速率執行。
void
TimerTask?task, long?delay, long?period)
安排指定的任務在指定的延遲后開始進行重復的固定速率執行。
3、TimerTask類的構造方法:
構造方法摘要
protected
方法摘要
boolean
abstract ?void
long
實際 執行的已安排 執行時間。
實例1:
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//每隔10s打印"hello,honey!";
new Timer().schedule(new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("hello,honey!");
}
}, 10000);
while(true){
System.out.println(new Date().getSeconds());//打印當前秒數
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
實例2:
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//每隔10s打印"hello,honey!";
new Timer().schedule(new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("hello,honey!");
}
}, 10000,3000);//10s后打印,以后每隔3s打印一次
/*while(true){
System.out.println(new Date().getSeconds());//打印當前秒數
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
}
}
運行結果:
總結
以上是生活随笔為你收集整理的java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java hibernate 多对多_j
- 下一篇: CTF-web基础