Java倒计时结束,不返回主程序

Java倒计时结束,不返回主程序,java,timer,countdown,Java,Timer,Countdown,我有一个控制电子元件的程序。我的问题是倒计时部分。实际上,如果我从main方法调用类倒计时,它将不会返回到main。该程序必须始终处于活动状态,并读取调用主程序中的第一个值,然后开始倒计时。 代码如下: public class CountDown { public static int a; public static Timer timer; public CountDown() { timer = new Timer();

我有一个控制电子元件的程序。我的问题是倒计时部分。实际上,如果我从main方法调用类倒计时,它将不会返回到main。该程序必须始终处于活动状态,并读取调用主程序中的第一个值,然后开始倒计时。 代码如下:

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();
            }
        }
    }
}

我已经检查过了,以确保我的怀疑是正确的。这不是因为您的
new Countdown()
没有返回到main方法,而是因为它立即返回。您想要做的可能是在
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方法(如果您愿意的话,您可以始终按照设定的时间量睡眠,而不是尝试等待正确的时间量)


我还建议通过避免使用静态变量
a
timer
(使用私有变量和setter/在构造函数中初始化它们),使这个类更适合重用。

这不是
TimerTask
的正确用法。它们的目的是允许在软件执行其他操作时在后台发生一些事情(您只是安排一些要执行的代码),因此当然不会等到倒计时完成后再返回主程序。你到底想用这个达到什么目的?如果我们知道目标是什么,建议另一种方法会更容易。我有一个传感器和一个电子元件,当传感器值为1时,它会开始倒计时,每次检测到移动时都会重置。当传感器为0且倒计时结束时,应继续使用主if监控传感器。谢谢@Kerberos:您是否知道将调用main方法?如果我错了,请告诉我,但我认为您可以通过调用构造函数中的内部类来启动循环。@记者:也许您是对的!但我不能测试,因为我在实验室里什么都有!如果是这样的话,我怎么能先打电话给总经理呢?谢谢您的帮助。@reporter在main方法中的
new CountDown()
行(至少在显示的代码中没有)之前,没有任何东西导致构造函数被执行。执行静态方法(如main)不需要存在实例。