2010-03-13 4 views
7

시간당 4 번 중앙 데이터베이스와 동기화되는 웹 응용 프로그램이 있습니다. 과정은 보통 2 분이 걸립니다. 이 프로세스를 X : 55, X : 10, X : 25 및 X : 40의 스레드로 실행하여 사용자가 X : 00, X : 15, X : 30 및 X : 45에서 알 수 있도록합니다. 그들에게는 데이터베이스의 깨끗한 복사본이 있습니다. 그것은 단지 기대를 관리하는 것입니다. 나는 java.util.concurrent에서 집행자를 지났지 만 스케줄링은 실제로 이것이 시간의 관점에서 실행될 때 어떤 보증도 제공하지 않는다고 믿는 scheduleAtFixedRate으로 수행됩니다. 첫 번째 지연 시간을 사용하여 Runnable을 시작할 수 있으므로 첫 번째 지연 시간은 15 분마다 시작 시간과 일정에 가깝지만 시간이 갈수록 길어지는 것으로 보입니다. 매 분기마다 5 분 전에 실행되도록 스레드를 예약하는 더 쉬운 방법이 있습니까?특정 시간에 자바 스레드 실행

답변

9

Runnable 일정에 "다음 실행"을 허용 할 수 있습니다.

같은

class Task implements Runnable { 
    private final ScheduledExecutorService service; 

    public Task(ScheduledExecutorService service){ 
     this.service = service; 
    } 

    public void run(){ 
     try{ 
      //do stuff 
     }finally{ 
      //Prevent this task from stalling due to RuntimeExceptions. 
      long untilNextInvocation = //calculate how many ms to next launch 
      service.schedule(new Task(service),untilNextInvocation,TimeUnit.MILLISECONDS); 
     } 
    } 
} 
+0

dit 인 이런 식으로 아름답게 노력하고 있습니다. 감사. – rmarimon

+1

@rmarimon : NP :) RuntimeException이 주기적 실행을 멈출 수 있다는 점에주의하십시오. 나는 이것으로 화상을 입었으므로 그에 따라 대답을 편집했다. –

+0

방금 ​​변경했습니다. 나는 try {} catch (Exception e) {}를 시도한 다음 다시 스케줄하는 것을 좋아했다. 그러나 마침내 올바른 접근 방식처럼 보인다. – rmarimon

1

TimerTask이 사례를 처리합니다. 당신은 작업 일정을 계속해야하지 않으려면

schedule(TimerTask, Date)를 참조하십시오, 당신은 Quartz 같은 작업 스케줄링 도구로보고 할 수 있습니다.

2

Quartz 응용 프로그램이 웹 기반이므로 적합합니다. 그것은 당신이 필요로하는 정교한 시간 기반의 스케줄링을 제공 할 것입니다. 가장 작은 독립 실행 형 응용 프로그램에서 -

석영 가 통합, 또는 실질적 측면 자바 EE 또는 Java SE 응용 프로그램을 함께 사용할 수있는 모든 기능을 갖춘 오픈 소스 작업 스케줄링 서비스 가장 큰 전자 상거래 시스템입니다. Quartz는 을 사용하여 수십, 수백 또는 심지어 수만 개의 작업을 실행하기위한 간단하거나 복잡한 일정을 만들 수 있습니다. ; 작업이 표준 Java 구성 요소로 정의 된 작업은 실질적으로 사용자가 수행하도록 프로그램 할 수있는 모든 구성 요소를 실행합니다. Quartz Scheduler에는 JTA 트랜잭션 및 클러스터링과 같은 많은 엔터프라이즈 급 기능이 포함되어 있습니다.

관련 문제