2012-07-24 61 views
0

我有一个程序,控制电子组件。我的问题是倒数的部分。实际上,如果我从主方法调用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'。他们的目的是让事情发生在后台,而你的软件做其他事情(你只是安排一些代码来执行),所以它当然不会等到倒计时完成后再返回主服务器。你究竟想用这个做什么?如果我们知道目标是什么,那么建议一种替代方法会更容易。 – Thor84no 2012-07-24 11:05:53

+0

我有一个传感器和一个电子元件,当传感器值为1时,它开始倒计时,每次检测到运动时都会复位。当传感器为0并且倒计时结束时,它应该继续用main if来监视传感器。谢谢! – Kerberos 2012-07-24 11:18:02

+0

@ Kerberos:你确定主要的方法会被调用吗?告诉我,如果我错了,但我认为你通过调用construtor中的内部类来开始循环。 – reporter 2012-07-24 11:24:37

回答

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(使用私有变量和设置器/在构造函数中初始化它们)来尝试使此类更适合于重用。