2015-11-16 2 views
1

У меня есть метод таймера, который запускается каждый раз, когда пользователь вводит что-то. В основном пользователь имеет минуту для ввода чего-либо или таймер будет печатать ответ, но он не будет печатать ответ, если пользователь вводит что-то до истечения таймера. В принципе, у меня возникли проблемы с отменой последнего таймера и вызовом нового, потому что, если я не отменяю таймер, предыдущий таймер продолжает работать, пока новый продолжает звонить, поэтому он просто создает огромный беспорядок. Мои методы нижеКак остановить таймер в java

Main:

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

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

Как именно я буду делать это отменить. Кто-то должен использовать метод cancel() в классе TimerTask, но я не понимаю, куда звонить или даже как.

ответ

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

так что-то возвращается, это не означает, что мы можем» t недействительны для метода timer(). Что вместо этого следует ввести вместо пустоты? – 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); 
} 
Смежные вопросы