2012-07-24 30 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(使用私有變量和設置器/在構造函數中初始化它們)來嘗試使此類更適合於重用。