Der Timer verfügt über zwei Modi zum Ausführen von Aufgaben. Der am häufigsten verwendete Modus ist der Zeitplan, der Aufgaben auf zwei Arten ausführen kann: 1: zu einem bestimmten Zeitpunkt (Daten), 2: nach einer festen Zeit (int-Verzögerung). Schauen wir uns ein einfaches Beispiel an:
Kopieren Sie den Codecode wie folgt:
import java.io.IOException;
import java.util.Timer;
öffentliche Klasse TimerTest {
public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new MyTask(), 1000, 2000); //Führen Sie diese Aufgabe nach 1 Sekunde mit einem Intervall von jeweils 2 Sekunden aus. Wenn Sie einen Datenparameter übergeben, können Sie diese Aufgabe zu einem festen Zeitpunkt ausführen.
while(true){//Dies wird verwendet, um diese Aufgabe zu stoppen, andernfalls wird diese Aufgabe weiterhin in einer Schleife ausgeführt
versuchen {
int ch = System.in.read();
if(ch-'c'==0){
timer.cancel();//Verwenden Sie diese Methode, um die Aufgabe zu beenden
}
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
}
}
Die statische Klasse MyTask erweitert java.util.TimerTask{
@Override
public void run() {
// TODO Automatisch generierter Methoden-Stub
System.out.println("________");
}
}
}
Wenn Sie JDK 5+ verwenden, ist auch ein ScheduleAtFixedRate-Modus verfügbar. In diesem Modus versucht der Timer sein Bestes, die Aufgabe mit einer festen Häufigkeit auszuführen. Im obigen Beispiel möchten wir, dass MyTask mit a ausgeführt wird Nach 1 Sekunde wird es alle zwei Sekunden ausgeführt. Da Java jedoch nicht in Echtzeit arbeitet (tatsächlich ist die Echtzeitleistung von Java sehr schlecht ...), haben wir die ursprüngliche Bedeutung im vorherigen Programm ausgedrückt Wenn wir „scheduleAtFixedRate“ aufrufen, versucht der Timer, die Ausführungshäufigkeit Ihrer Aufgabe alle 2 Sekunden beizubehalten. Unter der Annahme, dass „scheduleAtFixedRate“ verwendet wird, ist das folgende Szenario möglich: Nach 1 Sekunde MyTask Einmal ausgeführt, da das System ausgelastet ist, kann MyTask nach 2,5 Sekunden ein zweites Mal ausgeführt werden. Dann zeichnet der Timer diese Verzögerung auf und versucht, diese Verzögerung in der nächsten Aufgabe auszugleichen. Dreimal: „Führen Sie eine Aufgabe mit einer festen Häufigkeit und nicht mit einer festen Verzögerungszeit aus.“
Hier ist ein komplizierteres Beispiel, das Ihnen zeigt, wie Sie eine einzelne TimerTask und alle Tasks beenden.
Kopieren Sie den Codecode wie folgt:
Paket MyTimerTest;
import java.io.IOException;
import java.util.Timer;
/*
* Diese Klasse stellt die wichtigsten Methoden zur Verwendung von Timer und TimerTaske bereit, einschließlich des Anpassens von Aufgaben und des Hinzufügens von Aufgaben
* Beenden Sie die Aufgabe und beenden Sie den Timer.
* Da auf das Statusfeld von TimerTask auf Paketebene zugegriffen werden kann, gibt es keine Möglichkeit, außerhalb des java.util-Pakets darauf zuzugreifen.
* Ermitteln Sie den Status einer bestimmten Aufgabe, was zu Unannehmlichkeiten bei der Programmierung führt.
*
*/
öffentliche Klasse TimerTest {
public static void main(String[] args) {
Timer timer = new Timer();
MyTask myTask1 = new MyTask();
MyTask myTask2 = new MyTask();
myTask2.setInfo("myTask-2");
timer.schedule(myTask1, 1000, 2000);
timer.scheduleAtFixedRate(myTask2, 2000, 3000);
while (wahr) {
versuchen {
byte[] info = neues Byte[1024];
int len = System.in.read(info);
String strInfo = new String(info, 0, len, "GBK");//Informationen von der Konsole lesen
if (strInfo.charAt(strInfo.length() - 1) == ' ') {
strInfo = strInfo.substring(0, strInfo.length() - 2);
}
if (strInfo.startsWith("Cancel-1")) { myTask1.cancel();//Eine einzelne Aufgabe beenden
// Tatsächlich sollte hier beurteilt werden, ob myTask2 ebenfalls beendet wurde. Wenn ja, sollte es nicht funktionieren, da es nicht außerhalb des Pakets abgerufen werden kann
//Der Status von myTask2, daher kann hier nicht beurteilt werden, ob die Schleife verlassen werden soll.
} else if (strInfo.startsWith("Cancel-2")) {
myTask2.cancel();
} else if (strInfo.startsWith("Cancel-All")) {
timer.cancel();//Timer beenden
brechen;
} anders {
// Urteile nur über myTask1, sei faul ^_^
myTask1.setInfo(strInfo);
}
} Catch (IOException e) { // TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
}
}
Die statische Klasse MyTask erweitert java.util.TimerTask {
String info = "^_^";
@Override
public void run() {
// TODO Automatisch generierter Methoden-Stub
System.out.println(info);
}
öffentlicher String getInfo() {
Rückgabeinformationen;
}
public void setInfo(String info) {
this.info = info;
}
}
}