타이머에는 작업 실행을 위한 두 가지 모드가 있습니다. 가장 일반적으로 사용되는 것은 일정이며 두 가지 방법으로 작업을 실행할 수 있습니다: 1: 특정 시간(데이터), 2: 고정 시간 후(int 지연) 이 두 가지를 지정할 수 있습니다. 다음 방법 중 하나로 작업 실행 빈도를 살펴보겠습니다. 간단한 예를 살펴보겠습니다.
다음과 같이 코드 코드를 복사합니다 .
import java.io.IOException;
java.util.Timer 가져오기;
공개 클래스 TimerTest {
공개 정적 무효 메인(문자열[] 인수){
타이머 타이머 = new Timer();
timer.schedule(new MyTask(), 1000, 2000); //1초마다 2초 간격으로 이 작업을 실행합니다. Data 매개변수를 전달하면 고정된 시간에 이 작업을 실행할 수 있습니다.
while(true){//이 작업을 중지하는 데 사용됩니다. 그렇지 않으면 루프에서 이 작업을 계속 실행합니다.
노력하다 {
int ch = System.in.read();
if(ch-'c'==0){
timer.cancel();//작업을 종료하려면 이 메서드를 사용하세요.
}
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
}
정적 클래스 MyTask는 java.util.TimerTask를 확장합니다.
@보수
공개 무효 실행() {
// TODO 자동 생성된 메서드 스텁
System.out.println("________");
}
}
}
JDK 5+를 사용하는 경우 사용 가능한 ScheduleAtFixedRate 모드가 있습니다. 이 모드에서는 타이머가 고정된 빈도로 작업을 실행하기 위해 최선을 다합니다. 예: 위의 예에서는 MyTask가 일정 간격으로 실행되기를 원합니다. 1초 후에는 2초마다 실행됩니다. 그러나 Java는 실시간이 아니기 때문에(사실 Java의 실시간 성능은 매우 좋지 않습니다...) 이전 프로그램에서 표현한 원래 의미입니다. ScheduleAtFixedRate를 호출하면 Timer는 2초마다 작업의 실행 빈도를 유지하려고 시도합니다. ScheduleAtFixedRate가 사용된다고 가정하고 위 프로그램을 실행하면 다음 시나리오가 가능합니다. 한 번 실행되면 시스템이 바쁘기 때문에 2.5초 후에 두 번째 실행이 가능합니다. 그런 다음 Timer는 이 지연을 기록하고 다음 작업에서 이 지연을 보충하려고 시도합니다. 그런 다음 1.5초 후에 MyTask가 실행됩니다. "고정된 지연 시간이 아닌 고정된 빈도로 작업을 실행합니다."
다음은 단일 TimerTask를 종료하는 방법과 모든 작업을 종료하는 방법을 알려주는 더 복잡한 예입니다.
다음과 같이 코드 코드를 복사합니다 .
패키지 MyTimerTest;
import java.io.IOException;
java.util.Timer 가져오기;
/*
* 이 클래스는 작업 사용자 정의 및 작업 추가를 포함하여 Timer 및 TimerTaske를 사용하는 주요 방법을 제공합니다.
* 작업을 종료하고 타이머를 종료합니다.
* TimerTask의 상태 필드는 패키지 수준에서 액세스할 수 있으므로 java.util 패키지 외부에서는 액세스할 수 없습니다.
* 상태를 파악하므로 프로그래밍에 다소 불편이 있습니다. 특정 Task의 상태를 판단할 수 없습니다.
*
*/
공개 클래스 TimerTest {
공개 정적 무효 메인(String[] args) {
타이머 타이머 = new Timer();
MyTask myTask1 = new MyTask();
MyTask myTask2 = new MyTask();
myTask2.setInfo("myTask-2");
타이머.일정(myTask1, 1000, 2000);
타이머.scheduleAtFixedRate(myTask2, 2000, 3000);
동안 (참) {
노력하다 {
바이트[] 정보 = 새 바이트[1024];
int len = System.in.read(info);
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")) {
myTask2.cancel();
} else if (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 = 정보;
}
}
}