Таймер имеет два режима выполнения задач. Наиболее часто используется расписание, которое может выполнять задачи двумя способами: 1: в определенное время (данные), 2: через фиксированное время (int задержка). Эти два режима можно указать. частоту выполнения задачи любым из следующих способов. Давайте рассмотрим простой пример:
Скопируйте код кода следующим образом:
импортировать java.io.IOException;
импортировать java.util.Timer;
общественный класс TimerTest {
public static void main(String[] args){
Таймер таймер = новый таймер();
timer.schedule(new MyTask(), 1000, 2000); //Выполнять эту задачу через 1 секунду с интервалом в 2 секунды каждый раз. Если вы передадите параметр Data, вы сможете выполнить эту задачу в фиксированное время.
while(true){//Это используется для остановки этой задачи, в противном случае она продолжит выполнение этой задачи в цикле.
пытаться {
int ch = System.in.read();
если(ч-'c'==0){
timer.cancel();//Используйте этот метод для выхода из задачи
}
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
}
статический класс MyTask расширяет java.util.TimerTask{
@Override
общественный недействительный запуск () {
// TODO Автоматически сгенерированная заглушка метода
System.out.println("________");
}
}
}
Если вы используете JDK 5+ также доступен режим ScheduleAtFixedRate. В этом режиме таймер будет стараться запускать задачу с фиксированной частотой. Например: в приведенном выше примере мы хотим, чтобы 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 {
public static void main(String[] args) {
Таймер таймер = новый таймер();
MyTask myTask1 = новый MyTask();
MyTask myTask2 = новый MyTask();
myTask2.setInfo("myTask-2");
timer.schedule(myTask1, 1000, 2000);
timer.scheduleAtFixedRate(myTask2, 2000, 3000);
в то время как (истина) {
пытаться {
байт[] информация = новый байт[1024];
int len = System.in.read(информация);
String strInfo = new String(info, 0, len, "GBK");//Читать информацию из консоли
if (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")) {
мояЗадача2.отмена();
} else if (strInfo.startsWith("Cancel-All")) {
timer.cancel();//Выход из таймера
перерыв;
} еще {
// Выносите суждения только по myTask1, будьте ленивы ^_^
myTask1.setInfo(strInfo);
}
} catch (IOException e) { // TODO Автоматически создаваемый блок catch
е.printStackTrace();
}
}
}
статический класс MyTask расширяет java.util.TimerTask {
Строковая информация = "^_^";
@Override
общественный недействительный запуск () {
// TODO Автоматически сгенерированная заглушка метода
System.out.println(информация);
}
публичная строка getInfo() {
возврат информации;
}
public void setInfo (строковая информация) {
this.info = информация;
}
}
}