2012-07-24 2 views
0

전자 부품을 제어하는 ​​프로그램이 있습니다. 내 문제는 카운트 다운의 일부입니다. 실질적으로 main 메소드에서 CountDown 클래스를 호출하면 주 메소드로 리턴되지 않습니다. 프로그램은 항상 활성 상태 여야하며 통화 중 첫 번째 값을 읽고 카운트 다운을 시작합니다. 이 코드입니다 : 내 의심이 올바른지 확인하기 위해 검사 한Java 카운트 다운이 메인으로 돌아 가지 않고 끝납니다

public class CountDown 
{ 
    public static int a; 
    public static Timer timer; 

    public CountDown() 
    { 
     timer = new Timer(); 
     timer.schedule(new DisplayCountdown(), 0, 1000); 
    } 

    class DisplayCountdown extends TimerTask 
    { 
     int seconds = 15; 
     public void run() 
     { 
      if (seconds > 0) 
      { 
       System.out.println(seconds + " seconds remaining"); 

       if(READING BY ELECTRONIC COMPONENT == 1) 
       { 
        seconds=15; 
       } else { 
        seconds--; 
       } 
      } else { 
       System.out.println("Countdown finished"); 
       CountDown.a=0; 
      } 
     } 
    } 

    public static void main(String args[]) 
    { 
     CountDown.a = 0; 

     while(true) 
       { 
     if(READING ELECTRONIC COMPONENT == 1) 
     { 
      if (CountDown.a==0) 
      { 
       CountDown.a = 1; 
       new CountDown(); 
      } 
     } 
    } 
} 
+0

'TimerTask'를 적절히 사용하지 않았습니다. 당신의 소프트웨어가 다른 것들을 수행하는 동안 (당신은 단지 실행될 코드의 일정을 정하는 중이다.) 카운트 다운이 완료 될 때까지 기다리지 않고 main으로 돌아갈 때까지 기다리지 않을 것이다. 이것으로 실제로 무엇을 달성하려고합니까? 우리가 목표가 무엇인지 알면 다른 접근법을 제시하는 것이 더 쉬울 것입니다. – Thor84no

+0

나는 센서와 전자 부품을 가지고 있는데, 센서 값이 1 일 때 움직임을 감지 할 때마다 리셋되는 카운트 다운을 시작한다. 센서가 0이고 카운트 다운이 끝나면 메인 센서로 계속해서 센서를 모니터링해야합니다. 감사! – Kerberos

+0

@Kerberos : 주된 방법이 호출 될 것인가? 내가 틀렸다면 말해 봐라.하지만 나는 당신이 construtor에서 내부 클래스를 호출하여 루프를 시작한다고 생각한다. – reporter

답변

0

. new Countdown()이 기본 메소드로 돌아 가지 않는다는 것이 아니라 을 즉시으로 반환합니다. 원하는 것은 while(true) 루프에서 대기하고 카운트 다운이 완료되었는지 확인하는 것입니다. 의 라인을 따라 뭔가 :

CountDown countDown = null; 
while(true) 
{ 
    if (countDown == null || getReading() == 1) 
    { 
     if (CountDown.a == 0) 
     { 
      CountDown.a = 1; 
      countDown = new CountDown(); 
     } 
    } 
    while (countDown.isRunning()) 
    { 
     try 
     { 
      Thread.sleep(countDown.getRemainingSeconds() * 1000); 
     } 
     catch (InterruptedException ex) 
     { 
      // Ignore. 
     } 
    } 
} 

은 분명히 당신이 (당신은 항상 오히려 당신이 원하는 경우에 정확하게 시간의 적당한 양을 기다리는 것보다 정해진 시간 동안 잠을 수)를 isRunning는 및 getRemainingSeconds 메소드를 구현해야합니다.

정적 변수 atimer (개인 변수 및 설정자 사용/생성자에서 초기화) 대신이 클래스를 재사용하는 것이 좋습니다.