java.util.Timer의 초기 파악

응용 개발에서 5분마다 새로운 메일을 검사하는 등 주기적인 조작이 자주 필요하다.이런 조작에 있어서 가장 편리하고 효율적인 실현 방식은java를 사용하는 것이다.util.Timer 툴 클래스.예를 들어 다음 코드는 5분마다 새 메일이 있는지 확인합니다.
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

좋은 웹페이지 즐겨찾기