java.util.Timer의 초기 파악
4842 단어 다중 스레드java.util.Timer타이머 클래스
private java.util.Timer timer;
timer = new Timer(true);
timer.schedule(new java.util.TimerTask() {
public void run() {
//server.checkNewMail();
}
}, 0, 5*60*1000);
이 몇 줄의 코드를 사용하면 Timer 자체가 5분마다 서버를 호출합니다.checkNewMail() 메서드, 직접 스레드를 시작할 필요가 없습니다.Timer 자체도 다중 스레드가 동기화되어 여러 스레드가 하나의 Timer를 공용할 수 있으며 외부의 동기화 코드가 필요하지 않다.
더 자세한 예는 Java Tutorial에서 확인할 수 있습니다.
public class AnnoyingBeep {
Toolkit toolkit;
Timer timer;
public AnnoyingBeep() {
toolkit = Toolkit.getDefaultToolkit();
timer = new Timer();
timer.schedule(new RemindTask(),
0, //initial delay
1*1000); //subsequent rate
}
class RemindTask extends TimerTask {
int numWarningBeeps = 3;
public void run() {
if (numWarningBeeps > 0) {
toolkit.beep();
System.out.println("Beep!");
numWarningBeeps--;
} else {
toolkit.beep();
System.out.println("Time's up!");
//timer.cancel(); //Not necessary because we call System.exit
System.exit(0); //Stops the AWT thread (and everything else)
}
}
}
...
}
이 프로그램은 3초 간격으로 벨을 울리고 메시지 한 줄을 출력한다.세 번 순환하다.프로그램 출력은 다음과 같습니다.
<span style="font-size:14px;">Task scheduled.
Beep!
Beep! //one second after the first beep
Beep! //one second after the second beep
Time's up! //one second after the third beep</span>
Timer 클래스는 다음 코드가 지정한 시간 (초 단위) 을 지연시켜 어떤 작업을 수행하는 데 편리하게 사용할 수 있다.텔레비전 같은 지연 끄기 기능.
<span style="font-size:14px;">...
public class ReminderBeep {
...
public ReminderBeep(int seconds) {
toolkit = Toolkit.getDefaultToolkit();
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.println("Time's up!");
toolkit.beep();
//timer.cancel(); //Not necessary because we call System.exit
System.exit(0); //Stops the AWT thread (and everything else)
}
}
...
}</span>
주의
1. 위의 Remind Task처럼 세 번만 순환하는 것이 아니라 자신의 Task가 계속 운행되기를 바란다는 친구의 편지가 왔다.이것은 매우 간단하다. 아마도 이 친구가 Task의 역할을 잘못 이해했을 것이다. Task는 단지 한 번의 동작을 대표할 뿐이다.Task 루프를 완료하는 것이 아니라위의 RemindTask 에 있는 카운트는 세 번 정지해야 할 경우 계속 실행해야 하기 때문입니다.위의 계수와 관련된 코드를 모두 제거하면 된다.사실 Timer에는 실행 횟수가 지정된 후에 멈추는 메커니즘이 제공되지 않았기 때문에 위의 계수는 이 기능의 수요를 만족시켰다.2. Timer의 우선 순위를 설정할 수 있습니까?Timer에서는 하나의 스레드를 이용하여 시간과 주기 촉발 동작을 진행한다.현재 Timer 구현에는 우선순위를 설정하는 방법이 없습니다. new Timer () 를 호출할 때 라인이 시작되었기 때문에, Timer의 다음 버전에서 구성 방법에 우선순위 파라미터를 추가하지 않으면, 우선순위를 제어할 수 없습니다.현재 Timer의 기본값은 Thread입니다.NORM_PRIORITY 우선 순위에서 실행됩니다.그러나 Timer는 Timer(boolean is Daemon)의 구조 방법을 제공하여 Timer를 데몬 라인으로 설정할 수 있다.이렇게 하면, 당신의 프로그램에서 다른 라인이 모두 실행된 후에, 프로그램은 종료될 수 있습니다.3. Timer가 정확한 타이밍을 실현했습니까?아니요.Timer에서도 Object를 사용합니다.wait(long time)는 Object 때문에 시간을 정합니다.wait () 는 정확한 시간을 보장하지 않기 때문에 Timer도 정확한 시계가 아니다.실시간 시스템인 경우에는 Timer에 의존할 수 없습니다.4. (liangyiqing) 만약에 내가 한 Timer 클래스에 Timer 클래스를 하나 더 정의한다면 만약에 외부 정의의 시간이 24시간에 한 번 순환하고 내부 정의는 1시간에 한 번 순환하는 것이다. 즉, 한 시간 안에 한 번 운행한 후에 내부 Timer가 자원을 방출한다는 뜻이다. 외부 Timer도 방출되는 것이냐, 아니면 24시간 동안 계속 점용하는 것이냐고 묻고 싶다.나는 너의 점용 자원이 무슨 뜻인지 잘 모르겠다. 만약에Task에서 일부 자원을 사용한다면 이런 자원은Task 운행이 끝난 후에 즉시 방출해야 한다. 특히 경쟁 조건에 대해서는 가능한 한 적은 시간을 차지해야 한다.일반적으로 Task 는 사용자가 설정한 주기보다 짧은 시간에 실행됩니다.그렇지 않으면 Timer에 Task가 쌓입니다.위에서 말한 24시간과 1시간 두 주기의 조작을 실현하려면 Timer, schedule 두 개의 Task를 사용하면 된다.5. Timer를 멀티스레드 환경에서 사용할 수 있습니까?네.Timer에서 Task 를 저장하는 컨테이너가 동기화되어 멀티스레드 환경에서의 안전한 사용이 보장됩니다.6.(austin1979) 정시 시간은 변수로 할 수 있고 프로그램에서 변화할 수 있습니까?타이머가 켜진 후 순환 실행 시간을 변경할 수 있는지 여부입니다.Timer 는 여러 Task 의 주기별 트리거를 제어합니다.즉, 이 타임머신은 여러 시간을 정할 수 있는 알람시계와 유사하다. 예를 들어 내 휴대전화에는 세 개의 알람시계가 있다.그러나 Task 하나가 이미 schedule을 진행했다면 다시 설정할 수 없습니다.그래서 주기, 지연 등의 설정을 더 이상 바꿀 수 없다.다음 코드를 볼 수 있습니다.
synchronized(task.lock) {
if (task.state != TimerTask.VIRGIN)
throw new IllegalStateException(
"Task already scheduled or cancelled");
task.nextExecutionTime = time;
task.period = period;
task.state = TimerTask.SCHEDULED;
}
7.(eqingtian)Timer가 하나의 라인의 발사기라고 생각하면 안 돼요?
Timer에는 Task 를 저장하는 Queue 하나와 모든 Task 를 스케줄링하는 스레드 하나만 있습니다.네가 schedule을 몇 번 하든지 간에 Timer에 몇 개의Task를 추가하면 백엔드 라인만 스케줄링할 수 있다.
이 문서는 주소를 통해 참조됩니다.http://blog.csdn.net/winneryong/article/details/357533
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약 동료는 무심결에 이 문제를 제기하고 두 가지 방법을 직접 실천했다.물론 더 좋은 방법이 있을 거야. 방법 1 이런 방법은 비교적 흔히 볼 수 있는 해결 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.