يحتوي المؤقت على وضعين لتنفيذ المهام، والأكثر استخدامًا هو الجدول الزمني، والذي يمكنه تنفيذ المهام بطريقتين: 1: في وقت معين (البيانات)، 2: بعد وقت محدد (تأخير int). تكرار تنفيذ المهمة بأي من الطرق التالية دعونا نلقي نظرة على مثال بسيط:
انسخ رمز الكود كما يلي:
import java.io.IOException;
import java.util.Timer;
اختبار مؤقت للفئة العامة {
public static void main(String[] args){
مؤقت مؤقت = مؤقت جديد () ؛
timer.schedule(new MyTask(), 1000, 2000); // تنفيذ هذه المهمة بعد ثانية واحدة، بفاصل زمني قدره ثانيتين في كل مرة. إذا قمت بتمرير معلمة بيانات، فيمكنك تنفيذ هذه المهمة في وقت محدد.
while(true){// يُستخدم هذا لإيقاف هذه المهمة، وإلا فسوف يستمر في تنفيذ هذه المهمة في حلقة
يحاول {
int ch = System.in.read();
إذا (الفصل-'ج'==0){
timer.cancel();// استخدم هذه الطريقة للخروج من المهمة
}
} قبض (IOException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
}
فئة ثابتة MyTask تمتد java.util.TimerTask{
@تجاوز
تشغيل الفراغ العام () {
// TODO طريقة تم إنشاؤها تلقائيًا stub
System.out.println("________");
}
}
}
إذا كنت تستخدم JDK 5+، فهناك أيضًا وضع جدولة AtFixedRate متاح في هذا الوضع، وسيبذل المؤقت قصارى جهده لتشغيل المهمة بتردد ثابت. على سبيل المثال: في المثال أعلاه، نريد تشغيل MyTask بسرعة بعد ثانية واحدة، سيتم تنفيذه كل ثانيتين. ومع ذلك، نظرًا لأن Java ليست في الوقت الفعلي (في الواقع، أداء Java في الوقت الفعلي ضعيف جدًا...)، المعنى الأصلي الذي عبرنا عنه في البرنامج السابق. لا يمكن تنفيذه بشكل صارم إذا اتصلنا بـschedulAtFixedRate، فسيحاول Timer الحفاظ على تكرار تنفيذ مهمتك كل ثانيتين. قم بتشغيل البرنامج أعلاه، بافتراض استخدام scheduleAtFixedRate، فمن الممكن حدوث السيناريو التالي: بعد ثانية واحدة، MyTask. يتم تنفيذ MyTask مرة واحدة، لأن النظام مشغول، ويمكن تنفيذه مرة أخرى بعد 2.5 ثانية، ثم يسجل Timer هذا التأخير ويحاول تعويض هذا التأخير في المهمة التالية. وبعد 1.5 ثانية، سيتم تنفيذ MyTask. ثلاث مرات "تنفيذ مهمة بتردد ثابت بدلاً من وقت تأخير ثابت".
فيما يلي مثال أكثر تعقيدًا، يخبرك بكيفية الخروج من TimerTask واحد وكيفية الخروج من جميع المهام.
انسخ رمز الكود كما يلي:
حزمة MyTimerTest؛
import java.io.IOException;
import java.util.Timer;
/*
* توفر هذه الفئة الطرق الرئيسية لاستخدام Timer وTimerTaske، بما في ذلك تخصيص المهام وإضافة المهام
* الخروج من المهمة والخروج من الموقت.
* نظرًا لأن حقل الحالة الخاص بـ TimerTask يمكن الوصول إليه على مستوى الحزمة، فلا توجد طريقة للوصول إليه خارج الحزمة java.util.
* الحصول على حالتها مما يسبب بعض الإزعاج للبرمجة ولا يمكننا الحكم على حالة مهمة معينة.
*
*/
اختبار مؤقت للفئة العامة {
public static void main(String[] args) {
مؤقت مؤقت = مؤقت جديد () ؛
MyTask myTask1 = new MyTask();
MyTask myTask2 = new MyTask();
myTask2.setInfo("myTask-2");
timer.schedule(myTask1, 1000, 2000);
timer.scheduleAtFixedRate(myTask2, 2000, 3000);
بينما (صحيح) {
يحاول {
بايت[] معلومات = بايت جديد[1024];
int len = System.in.read(info);
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، لذلك لا يمكن الحكم هنا على ما إذا كان سيتم الخروج من الحلقة أم لا.
} else if (strInfo.startsWith("Cancel-2")) {
myTask2.cancel();
} else if (strInfo.startsWith("Cancel-All")) {
timer.cancel();//الخروج من المؤقت
استراحة؛
} آخر {
// فقط أصدر أحكامًا على myTask1، كن كسولًا ^_^
myTask1.setInfo(strInfo);
}
} Catch (IOException e) { // كتلة التقاط TODO التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
}
فئة ثابتة MyTask تمتد java.util.TimerTask {
معلومات السلسلة = "^_^";
@تجاوز
تشغيل الفراغ العام () {
// TODO طريقة تم إنشاؤها تلقائيًا stub
System.out.println(info);
}
سلسلة عامة getInfo () {
معلومات العودة؛
}
مجموعة الفراغ العام (معلومات السلسلة) {
this.info = info;
}
}
}