2010-12-28 1 views
68

예약 된 작업을 구현하기 위해 몇 가지 코드를 시도했으며 이러한 코드를 생각해 냈습니다.정기적 인 간격으로 작업을 실행하도록 예약하려면 어떻게합니까?

import java.util.*; 

class Task extends TimerTask { 


    int count = 1; 

    // run is a abstract method that defines task performed at scheduled time. 
    public void run() { 
     System.out.println(count+" : Mahendra Singh"); 
     count++; 
    } 
} 

class TaskScheduling { 

    public static void main(String[] args) { 
     Timer timer = new Timer(); 


     // Schedule to run after every 3 second(3000 millisecond) 
     timer.schedule(new Task(), 3000); 
    } 
} 

내 출력 :

1 : Mahendra Singh 

내가 3 개의주기적인 간격으로하지만, 약 15 분 동안 대기에도 불구하고 마헨드라 싱의 일련의 인쇄 컴파일러를 예상, 나는 단지 하나 개의 출력을 얻을 ... 어떻게 해결할 수 있습니까?

+0

** 쿼츠 스케쥴러 ** 지정된 날짜와 시간에 작업/작업을 스케줄하도록 Java 응용 프로그램을 지원합니다. [전체 예제보기] (http://geekonjava.blogspot.com/2015/05/how -to-scheduling-job-in-java-via.html) – GeekOnJava

답변

58

사용을 timer.scheduleAtFixedRate

public void scheduleAtFixedRate(TimerTask task, 
           long delay, 
           long period) 

스케줄 지정된 작업을 사용할 수 있습니다. 후속 실행은 대략 일정한 간격으로 지정된 기간만큼 분리되어 수행됩니다.
고정 속도 실행에서는 각 실행이 초기 실행의 예약 된 실행 시간과 관련하여 예약됩니다. 어떤 이유 (예 : 가비지 수집 또는 기타 백그라운드 활동)로 인해 실행이 지연되는 경우, 두 번 이상의 실행이 "따라 잡기"위해 연속적으로 발생합니다. 장기적으로 실행 빈도는 지정된 기간의 역수가됩니다 (Object.wait (long)의 기본 시스템 시계가 정확하다고 가정).

고정 속도 실행은 절대 시간에 민감한 반복 활동 (예 : 매 시간마다 벨소리 울림 또는 특정 시간에 매일 예약 된 유지 관리 실행)에 적합합니다. 또한 10 초 동안 매 초마다 한 번씩 카운트 다운하는 카운트 다운 타이머와 같이 고정 된 실행 횟수를 수행하는 총 시간이 중요한 반복 활동에도 적합합니다. 마지막으로 고정 속도 실행은 서로에 대해 동기화 된 상태로 유지되어야하는 여러 반복 타이머 작업을 예약하는 데 적합합니다.

매개 변수 :

  • 작업 - 작업이 예약 할 수 있습니다.
  • 지연 - 작업이 실행되기 전의 밀리 초 단위의 지연.
  • 기간 - 연속 된 작업 실행 간의 시간 간격 (밀리 초).

예외 :

  • , IllegalArgumentException를 - 지연이 부정 또는 지연 +에 System.currentTimeMillis()가 음수 인 경우.
  • IllegalStateException - 작업이 이미 예약되거나 취소되었거나 타이머가 취소되었거나 타이머 스레드가 종료 된 경우.
+3

scheduleAtFixedRate는 출력을 한 번만 가져 오는 문제를 해결하지 못합니다. –

+0

@ JamesA.N.Stauffer, 그는 한 번이 아니라 반복적으로 출력을 필요로합니다. – st0le

+1

네, 그러나 반복은 단순히 세 번째 인수를 추가하여 이루어집니다 - 메서드를 변경하지 않아도됩니다. –

12
public void schedule(TimerTask task,long delay) 

지정한 지연 후에 지정된 작업을 실행하도록 예약합니다.

은 당신이 원하는 : 반복 고정 지연 실행을위한

public void schedule(TimerTask task, long delay, long period) 

스케줄 지정된 작업을 지정된 지연 후에 시작. 후속 실행은 지정된 기간만큼 분리 된 대략 일정 간격으로 수행됩니다.

3

당신은 지정된 지연 후에 시작이 고정 속도 실행을 반복 Quartz

+20

-1 기존 프레임 워크로 수행 할 수있는 기본적인 작업만으로 필요한 또 다른 라이브러리. 예 쿼츠는 더 많은 일을 할 수 있지만,이 질문의 맥락에서 도움이되지 못합니다. – JDC

+2

@ JDC : 왜 바퀴를 재발 명하게 만드세요! –

+0

위의 의견에 동의하지만 예제를 제시하면 여전히 OK 응답이라고 말할 수 있습니다. SO 규칙은 링크가 대답이 아니라고 말합니다. 이것은 주석이어야합니다. –

65

ScheduledExecutorService를

당신에게 사용 타이머에 대한 대안을 제공 할

-ScheduledThreadPoolExecutorScheduledExecutorService 인터페이스의 구현을. "Java in Concurrency"의 Timer 클래스에 비해 몇 가지 장점이 있습니다.

타이머는 타이머 작업을 실행하기 위해 하나의 스레드 만 만듭니다. 타이머 작업이 너무 오래 실행되면 다른 TimerTask의 타이밍 정확도가 떨어질 수 있습니다. 반복 TimerTask가 매 10ms마다 실행되도록 예약되고 다른 Timer-Task가 실행하는 데 40ms가 걸리면 반복 태스크는 고정 속도 또는 고정 지연으로 예약되었는지 여부에 따라 긴 시간이 지나면 연속적으로 4 번 호출됩니다 실행중인 작업이 완료되거나 네 개의 호출이 완전히 누락됩니다. 예약 된 스레드 풀은 지연 및 주기적 작업을 실행하기 위해 여러 스레드를 제공함으로써이 제한을 해결합니다.

Timer의 또 다른 문제점은 TimerTask가 검사되지 않은 예외를 throw하면 제대로 작동하지 않는다는 것입니다. 타이머 스레드는 예외를 catch하지 않으므로 TimerTask에서 throw 된 검사되지 않은 예외가 타이머 스레드를 종료합니다. Timer는이 상황에서 스레드를 부활시키지 않습니다. 대신, 전체 타이머가 취소되었다고 잘못 가정합니다. 이 경우 이미 예약되었지만 아직 실행되지 않은 TimerTasks는 실행되지 않으며 새 작업을 예약 할 수 없습니다. (이 문제는 "스레드 유출"이라고 함).

자신 만의 예약 서비스를 작성해야하는 경우 ScheduledThreadPoolExecutor의 예약 기능을 제공하는 BlockingQueue 구현 인 DelayQueue를 사용하여 라이브러리를 계속 활용할 수 있습니다. DelayQueue는 지연 객체의 컬렉션을 관리합니다. Delayed에는 지연 시간이 있습니다. DelayQueue를 사용하면 지연 시간이 만료 된 경우에만 요소를 가져올 수 있습니다. 오브젝트는, 지연과 관련한 시간순에 순서 붙이고 된 DelayQueue로부터 돌려 주어집니다.

+2

타이머의 또 다른 문제점은 시스템 클록을 변경하면 타이머가 망가지는 것입니다 – rajath

0

이 목적을 위해 Java에는 Timer 및 TimerTask 클래스가 있지만 그 기능은 무엇입니까?

  • java.util.Timer은 미래의 특정 시간에 실행하는 스레드를 예약하는 데 사용할 수있는 유틸리티 클래스입니다. Java 타이머 클래스 을 사용하여 한 번만 실행하거나 일정한 간격으로 간격으로 작업을 예약 할 수 있습니다.
  • java.util.TimerTask는 의 Runnable 인터페이스를 구현하는 추상 클래스이며, 우리는 자바 타이머 클래스를 사용하여 예약 할 수 있습니다 우리 자신의 의 TimerTask를 만들려면이 클래스를 확장해야합니다.

당신은 GeekonJava

TimerTask timerTask = new MyTimerTask(); 

//running timer task as daemon thread 

Timer timer = new Timer(true); 

timer.scheduleAtFixedRate(timerTask, 0, 10*1000); 
3

석영 스케줄러에서 전체 자습서를 확인하실 수 있습니다 또한 솔루션이며, 첫째로 당신은 석영 작업 클래스를 확인합니다.작업 당신이 트리거의 두 가지 유형이 석영

SimpleTrigger에 있습니다 석영 트리거

을해야 지금

package com.blogspot.geekonjava.quartz; 
import org.quartz.Job; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
import org.quartz.JobKey; 
public class QuartzJob implements Job { 
     public void execute(JobExecutionContext context) 
         throws JobExecutionException { 
       JobKey jobKey = context.getJobDetail().getKey(); 
       System.out.println("Quartz" + "Job Key " + jobKey); 
     } 
} 

를 실행하려면 어떻게 정의

석영 - 시작 시간, 종료 시간, 반복 간격을 설정할 수 있습니다.

Trigger trigger = newTrigger().withIdentity("TriggerName", "Group1") 
       .withSchedule(SimpleScheduleBuilder.simpleSchedule() 
       .withIntervalInSeconds(10).repeatForever()).build(); 

CronTrigger은 - 당신의 작업을 실행할 날짜와 시간을 지정하기 위해 유닉스 크론 표현을 할 수 있습니다.

Trigger trigger = newTrigger() 
       .withIdentity("TriggerName", "Group2") 
       .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build(); 

스케줄러 클래스 링크 작업함께 트리거하고 실행 모두.

Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
scheduler.start(); 
scheduler.scheduleJob(job, trigger); 

Full Example you can see here

1

timer.scheduleAtFixedRate (새 작업(), 1000,3000);