2015-11-16 203 views
1

我有一個計時器方法,每次用戶輸入內容時都會運行。基本上用戶有一分鐘的時間來輸入內容,或者定時器會打印一個響應,但是如果用戶在定時器耗盡之前輸入了某些東西,它將不會打印響應。基本上,我無法取消最後一個定時器並調用一個新定時器,因爲如果我不取消定時器,前一個定時器繼續運行,而新定時器繼續調用,所以它只是造成了巨大的混亂。我的方法如下如何在java中停止計時器

主營:

public static void main(String[] args) { 
    while(true) { 
      runner(); 
    } 
} 

亞軍:

public static void runner() { 
    timer(); 
    String s = input.nextLine(); 
    System.out.println(s); 

} 

定時器:

public static void timer() { 
    TimerTask task = new TimerTask() { 
      public void run() { 
       System.out.println("Say something already!"); 
      } 
    }; 
    long delay = TimeUnit.MINUTES.toMillis(1); 
    Timer t = new Timer(); 
    t.schedule(task, delay); 
} 

我究竟是如何使這個取消。有人要我在TimerTask類中使用cancel()方法,但我不明白在哪裏調用,甚至如何。

回答

1

有timer()方法返回TimerTask對象,並且當input.nextLine()返回時,調用TimerTask.cancel()。

public static void runner() { 
    TimerTask t = timer(); 
    String s = input.nextLine(); 
    t.cancel(); 
    System.out.println(s); 
} 

public static void timer() { 
    TimerTask task = new TimerTask() { 
      public void run() { 
       System.out.println("Say something already!"); 
      } 
    }; 
    long delay = TimeUnit.MINUTES.toMillis(1); 
    Timer t = new Timer(); 
    t.schedule(task, delay); 
    return task; 
} 

也可以返回定時器來代替,而調用Timer.cancel()

+0

因爲被返回的東西,並不意味着我們可以」沒有timer()方法的void。那麼應該採取什麼措施而不是無效的呢? – user3450498

+0

是的,錯字。定時器的返回類型應該是TimerTask(或Timer),具體取決於返回哪個對象。 – DBug

-1

我想這可能是工作:

Main: 

TimerTask task; 

public static void main(String[] args) { 

    Scanner scan = new Scanner(System.in); 
    runner(); 

    while(true) { 

     timer(); //run timer 
     String line = scan.nextLine(); //read line (happens after hit Enter) 
     System.out.println(line); 
     //if line is read, then rerun timer which has on next iteration 
    } 

} 

Timer: 

public static void timer() { 

    if(null != task) { 
     task.cancel(); 
    } 

    task = new TimerTask() { 
      public void run() { 
       System.out.println("Say something already!"); 
       //timer(); reinit maybe after 1 min again? 
      } 
    }; 

    long delay = TimeUnit.MINUTES.toMillis(1); 
    Timer t = new Timer(); 
    t.schedule(task, delay); 
}