Timer 및 TimeTask 소개

4473 단어 java 학습
옮겨 싣다
Timer는 향후 백그라운드 스레드에서 수행될 작업을 예약하는 스레드 시설입니다.작업을 한 번 예약하거나 정기적으로 반복할 수 있으며 타이머로 보고 TimerTask를 스케줄링할 수 있습니다.TimerTask는 추상적인 클래스로 Runnable 인터페이스를 실현했기 때문에 다중 스레드 능력을 갖추었다.
import java.util.TimerTask;
public class MyTask extends TimerTask{
    private int id;

    public MyTask(int id){
        this.id = id;
    }
    public void run(){
        System.out.println("  " + id + ":    ");
    //System.gc();
    }
}

그런 다음 기본 프로그램 코드는 다음과 같습니다.
import java.util.Date;
import java.util.Timer;
public class Test{
    public static void main(String[] args){
        Timer timer = new Timer();
        timer.schedule(new MyTask(1), 5000);// 5      
        MyTask secondTask = new MyTask(2);
        timer.schedule(secondTask, 1000, 3000);
        // 1      ,    3       
        Date date = new Date();
        timer.schedule(new MyTask(3), new Date(date.getTime() + 1000));
        //       date   ,           
        //      timer.cancel();
        //      secondTask.cancel();
        System.out.println("main thread   !");
    }
}

Timer에는 4개의 schedule 재부팅 함수와 2개의 schedule AtFixedRate가 있습니다.
  • void schedule AtFixedRate(TimerTask task, Date firstTime, long period)는 지정된 작업을 지정된 시간에 중복된 고정 속도로 실행하도록 배정합니다.
  • void scheduleAtFixedRate(TimerTask task, long delay, long period)는 지정된 작업이 지정된 지연 후에 중복된 고정 속도로 실행되도록 스케줄링합니다.

  • scheduleAtFixedRate를 사용하면 Timer는 가능한 한 작업이 고정된 주파수에서 실행될 수 있도록 합니다.
    예를 들어 위의 예에서secondTask를 1초 후에 3초에 한 번씩 실행하도록 했지만 자바는 실시간이 아니기 때문에 우리가 지난 프로그램에서 표현한 원뜻은 엄격하게 집행할 수 없다. 예를 들어 자원 스케줄이 4초 긴장된 후에야 다음을 집행할 수도 있고 3.5초 후에 집행할 수도 있다.
    만약 우리가 schedule AtFixedRate를 호출한다면, Timer는 가능한 한 당신의 secondTask 실행 빈도를 3초에 한 번씩 유지하도록 할 것입니다.
    위의 프로그램을 실행하고 schedule AtFixed Rate를 사용한다고 가정하면 다음 장면은 가능하다. 1초 후에 SecondTask가 한 번 실행된다. 시스템이 바쁘기 때문에 3.5초 후에 SecondTask가 두 번째 실행을 할 수 있다. 그리고 Timer는 이 지연을 기록하고 다음 작업에서 이 지연을 메우려고 시도한다. 그러면 2.5초 후에 SecondTask가 세 번 실행될 것이다.'일정한 지연 시간이 아니라 고정된 주파수로 임무를 수행한다' 는 뜻이다.
    Timer 종료 문제: 기본적으로 프로그램의 Timer 루틴이 실행되면 이 프로그램은 실행을 유지합니다.다음 3가지 방법으로 timer 스레드를 종료할 수 있습니다.
    (1)timer의 cancle 방법을 호출합니다.프로그램의 어느 곳에서든 이 방법을 호출할 수 있으며, 심지어timer task의run 방법에서도 호출할 수 있다.
    (2)timer 라인을 하나의 데몬 라인으로 만들 수 있다. (timer를 만들 때 new Timer(true)를 사용하여 이 위치에 도달할 수 있다. 그러면 프로그램이 데몬 라인만 있을 때 자동으로 실행을 중지한다.
    (3) System을 호출합니다.exit 방법으로 전체 프로그램 (모든 라인) 을 종료합니다.TimerTask 에도 cancel 메서드가 있습니다.
    위에서 말한 "한 프로그램의timer 라인이 실행된다면 이 프로그램은 실행을 유지할 것이다."반대로 Timer의 모든 TimerTask가 실행되면 전체 프로그램이 종료됩니까? 테스트 답안은 부정적입니다. 예를 들어 위의 테스트 코드와 첫 번째 TimerTask만 Timer에서 실행된다면:
    timer.schedule(new MyTask(1), 5000);// 5      

    그러면 5초 후에도 사실 전체 프로그램이 종료되지 않았습니다. Timer는 쓰레기 수거를 기다릴 때 회수되고 프로그램이 종료될 수 있습니다. 그런데 얼마나 걸릴까요?TimerTask의run 함수가 실행된 후에 System을 추가합니다.gc();됐어요.

    좋은 웹페이지 즐겨찾기