ตัวจับเวลามีสองโหมดสำหรับการดำเนินการ งานที่ใช้กันมากที่สุดคือกำหนดเวลาซึ่งสามารถดำเนินการได้สองวิธี: 1: ในเวลาที่กำหนด (ข้อมูล) 2: หลังจากเวลาที่กำหนด (int ล่าช้า) คุณสามารถระบุได้ ความถี่ในการปฏิบัติงานด้วยวิธีใดวิธีหนึ่งต่อไปนี้ ลองดูตัวอย่างง่ายๆ:
คัดลอกรหัสรหัส ดังต่อไปนี้:
นำเข้า java.io.IOException;
นำเข้า java.util.Timer;
TimerTest คลาสสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
ตัวจับเวลา ตัวจับเวลา = ตัวจับเวลาใหม่ ();
timer.schedule(new MyTask(), 1000, 2000); //ดำเนินการงานนี้หลังจาก 1 วินาที โดยมีช่วงเวลา 2 วินาทีในแต่ละครั้ง หากคุณส่งผ่านพารามิเตอร์ Data คุณสามารถดำเนินการงานนี้ในเวลาที่กำหนด
ในขณะที่ (จริง){//ใช้เพื่อหยุดงานนี้ ไม่เช่นนั้นจะดำเนินการงานนี้แบบวนซ้ำต่อไป
พยายาม {
int ch = System.in.read();
ถ้า(ch-'c'==0){
timer.cancel();//ใช้วิธีนี้เพื่อออกจากงาน
-
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
-
คลาสคงที่ MyTask ขยาย java.util.TimerTask {
@แทนที่
โมฆะสาธารณะวิ่ง () {
// TODO ต้นขั้ววิธีการสร้างอัตโนมัติ
System.out.println("________");
-
-
-
หากคุณใช้ JDK 5+ จะมีโหมด scheduleAtFixedRate ให้ใช้งานได้ ในโหมดนี้ Timer จะพยายามรันงานอย่างดีที่สุดด้วยความถี่คงที่ ตัวอย่างเช่น ในตัวอย่างข้างต้น เราต้องการให้ MyTask ทำงานที่ ความถี่คงที่ หลังจาก 1 วินาที มันจะถูกดำเนินการทุกๆ สองวินาที อย่างไรก็ตาม เนื่องจาก java ไม่ใช่เรียลไทม์ (อันที่จริง ประสิทธิภาพเรียลไทม์ของ Java แย่มาก...) ความหมายดั้งเดิมที่เราแสดงไว้ในโปรแกรมก่อนหน้า ไม่สามารถดำเนินการอย่างเคร่งครัด หากเราเรียก scheduleAtFixedRate จากนั้น Timer จะพยายามรักษาความถี่ในการดำเนินการของงานของคุณทุกๆ 2 วินาที รันโปรแกรมข้างต้นโดยสมมติว่าใช้ scheduleAtFixedRate ดังนั้นสถานการณ์ต่อไปนี้จะเป็นไปได้: หลังจาก 1 วินาที MyTask ดำเนินการหนึ่งครั้ง เนื่องจากระบบไม่ว่าง MyTask จึงสามารถดำเนินการได้เป็นครั้งที่สองหลังจากผ่านไป 2.5 วินาที จากนั้น Timer จะบันทึกการหน่วงเวลานี้และพยายามชดเชยการหน่วงเวลานี้ในงานถัดไป จากนั้น หลังจาก 1.5 วินาที MyTask จะถูกดำเนินการ สามครั้ง "ดำเนินงานด้วยความถี่คงที่มากกว่าเวลาหน่วงคงที่"
นี่เป็นตัวอย่างที่ซับซ้อนมากขึ้น ซึ่งจะบอกคุณถึงวิธีออกจาก TimerTask เดียว และวิธีออกจากงานทั้งหมด
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ MyTimerTest;
นำเข้า java.io.IOException;
นำเข้า java.util.Timer;
-
* คลาสนี้ให้วิธีการหลักในการใช้ Timer และ TimerTaske รวมถึงการปรับแต่งงานและเพิ่มงาน
* ออกจากงานและออกจากตัวจับเวลา
* เนื่องจากฟิลด์สถานะของ TimerTask สามารถเข้าถึงได้ในระดับแพ็คเกจ จึงไม่มีทางที่จะเข้าถึงได้นอกแพ็คเกจ java.util
* รับสถานะซึ่งทำให้เกิดความไม่สะดวกในการเขียนโปรแกรม เราไม่สามารถตัดสินสถานะของงานบางอย่างได้
-
-
TimerTest คลาสสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
ตัวจับเวลา ตัวจับเวลา = ตัวจับเวลาใหม่ ();
MyTask myTask1 = MyTask ใหม่();
MyTask myTask2 = MyTask ใหม่();
myTask2.setInfo("myTask-2");
timer.schedule(myTask1, 1,000, 2000);
จับเวลา.scheduleAtFixedRate(myTask2, 2000, 3000);
ในขณะที่ (จริง) {
พยายาม {
ไบต์ [] ข้อมูล = ไบต์ใหม่ [1024];
int len = System.in.read (ข้อมูล);
String strInfo = new String(info, 0, len, "GBK");//อ่านข้อมูลจากคอนโซล
ถ้า (strInfo.charAt(strInfo.length() - 1) == ' ') {
strInfo = strInfo.substring(0, strInfo.length() - 2);
-
if (strInfo.startsWith("Cancel-1")) { myTask1.cancel();//ออกจากงานเดียว
//อันที่จริงควรตัดสินที่นี่ว่า myTask2 ออกไปแล้วหรือยัง ถ้าเป็นเช่นนั้นก็ควรจะพัง แต่เนื่องจากไม่สามารถรับได้จากภายนอกแพ็คเกจ
//สถานะของ myTask2 ดังนั้นจึงไม่สามารถตัดสินได้ว่าจะออกจากลูปหรือไม่
} อื่นถ้า (strInfo.startsWith("Cancel-2")) {
myTask2.ยกเลิก();
} อื่นถ้า (strInfo.startsWith("ยกเลิกทั้งหมด")) {
timer.cancel();//ออกจากตัวจับเวลา
หยุดพัก;
} อื่น {
// ตัดสินเฉพาะ myTask1 เท่านั้น ขี้เกียจ ^_^
myTask1.setInfo(strInfo);
-
} catch (IOException e) { // TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
-
คลาสคงที่ MyTask ขยาย java.util.TimerTask {
ข้อมูลสตริง = "^_^";
@แทนที่
โมฆะสาธารณะวิ่ง () {
// TODO ต้นขั้ววิธีการสร้างอัตโนมัติ
System.out.println (ข้อมูล);
-
สตริงสาธารณะ getInfo() {
ข้อมูลการส่งคืน;
-
โมฆะสาธารณะ setInfo (ข้อมูลสตริง) {
this.info = ข้อมูล;
-
-
-