2016-08-03 1 views
2

내 요구 사항을 찾으십시오. 모든 초/분/시간에 대해 TimerClass를 호출하는 InvokeTimer 클래스가 있습니다. TimerClass의 실행 가능 타이머는 매 초마다 타이머가 트리거 될 때 논리를 실행해야합니다. 즉 stats1 및 다른 논리의 인스턴스가 있다면 stats2의 인스턴스가 매분마다 실행되면 1 시간 동안 유사합니다. 제발 도와주세요. 어떻게해야합니까?여러 작업을 예약하기위한 타이머 작업

public class TimerClass extends TimerTask{ 
    @Override 
    public void run() { 
    if(stats1){ 
     //logic 
    }else if(stats2){ 
     //logic 
    }else{ 
    //logic3 
    } 
} 

public class InvokeTimer { 
     TimerClass stats1 = new TimerClass(); 
     TimerClass stats2 = new TimerClass(); 
     TimerClass stats3 = new TimerClass(); 
     Timer timer = new Timer(true); 

     timer.scheduleAtFixedRate(stats1, 0, 1 * 1000); 
     timer.scheduleAtFixedRate(stats2, 0, 60 * 1000); 
     timer.scheduleAtFixedRate(stats3, 0, 24* 60 * 1000); 
} 

답변

1

는 솔직히 여기에 가장 좋은 건 당신의 타이머 각각 run() 메소드를 지원하는 익명 클래스를 만들 수 있습니다 생각합니다. 당신은 각 통계의 방법 내에서 고유 로직, 각 통계에 대한 하나를 가질 수

TimerClass stats1 = new TimerClass() { 
    @Override 
    public void run() { 
     java.awt.Toolkit.getDefaultToolkit().beep(); 
    } 
}; 

Timer timer = new Timer(true); 
timer.scheduleAtFixedRate(stats1, 0, 1 * 1000); 

: 예를 들어,이 매 초마다 삐삐 TimerClass이 될 것입니다.

동일한 방법으로 모두 실행중인 통계 버전을 확인하는 것은 믿을 수 없을만큼 신뢰할 수있는 방법은 아니지만 죽은 상태라면 TimerClass 객체 인스턴스 변수를 만들 수 있다고 가정합니다. 에 문이있는 경우 -

if(this.equals(stats1)) 
    //logic 

말을하지만 난 TimerTask를 그들을 볼 수 있도록 동일한 된 .java 파일에 두 클래스가 필요 거라고 생각합니다. 내가 너라면 전 접근 방식을 고수 할거야.

현재 익명 클래스에 대한 자세한 내용을 찾을 수 있습니다 당신은 기본 클래스에 공통 기능을 넣을 수 있습니다 https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

0

.

모든 특정 통계 클래스를 기본 클래스로 확장합니다.

여러 개이면 else 문이 코드를 혼란시킵니다.

ScheduledThreadPoolExecutor가 타이머보다 나은 이유는 here입니다.

귀하의 유스 케이스에 가장 적합하도록 ScheduledThreadPoolExecutor를 사용해보십시오.

예.

public class ScheduleSimulator { 

    public static void main(String[] args) { 

     final ScheduledExecutorService executor = Executors 
       .newScheduledThreadPool(3); 
     executor.scheduleAtFixedRate(new Stats1("X"), 0, 1, TimeUnit.SECONDS); 
     executor.scheduleAtFixedRate(new Stats2("Y"), 0, 1, TimeUnit.MINUTES); 
     executor.scheduleAtFixedRate(new Stats3("Z"), 0, 1, TimeUnit.HOURS); 

     Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 

      @Override 
      public void run() { 
       executor.shutdownNow(); 

      } 
     })); 
    } 
} 

class CommonStats { 
    // Common functionality. 

} 

class Stats1 extends CommonStats implements Runnable { 
    private String name; 

    public Stats1(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public void run() { 
     try { 
      System.out.println("Doing a task during : " + name + " - Time - " 
        + new Date()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class Stats2 extends CommonStats implements Runnable { 
    private String name; 

    public Stats2(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public void run() { 
     try { 
      System.out.println("Doing a task during : " + name + " - Time - " 
        + new Date()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

class Stats3 extends CommonStats implements Runnable { 
    private String name; 

    public Stats3(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public void run() { 
     try { 
      System.out.println("Doing a task during : " + name + " - Time - " 
        + new Date()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 
관련 문제