TimerTask начать останавливать выполнение только один раз - PullRequest
1 голос
/ 03 октября 2011

Проблема, я могу запустить таймер только один раз.Я знаю это, потому что я вызвал функцию timer2.cancel ();и timer1.cancel ();:: Отмените то, чтобы быть "Никогда не запускайте это когда-либо снова".Мне нужна функция замены, которая на самом деле останавливает таймер, но может быть снова запущена при повторном планировании.Как мне это сделать?

      public void actionPerformed (ActionEvent e){

      if (e.getSource()==jbtStart)
      {

          System.out.println("Start is pressed");
          timer2.cancel();        
          timer1.schedule(new Task(), 0, delay);
      }

      else if (e.getSource()==jbtStop)
      {   
            System.out.println("Stop is pressed");
            timer1.cancel();        
            timer2.schedule(new Task2(), 0, delay);

      }

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Почему бы просто не создать новый Timer в этот момент? Либо это, либо удерживайте TimerTask, а также таймер, и отмените это вместо самого таймера.

В качестве третьей возможной альтернативы, имейте одну задачу таймера и один таймер, но информируйте задачу таймера о том, что она должна делать в любой момент - похоже, вы эффективно переключаете Вы хотите делать каждый раз, когда таймер тикает. Вы всегда можете оставить два отдельных класса для разделения логической функциональности, а затем выполнить задачу «обертка», которая позволяет заменить поведение, выполняемое при каждом запуске.

1 голос
/ 03 октября 2011

Я бы отменил TimerTasks вместо таймеров (и я бы использовал только один таймер).

UPDATE:

   private Task task1;
   private Task2 task2;

 public void actionPerformed (ActionEvent e){

      if (e.getSource()==jbtStart)
      {

          System.out.println("Start is pressed");
          if (task2 != null) {
              task2.cancel();
          }
          task1 = new Task();
          timer.schedule(task1, 0, delay);
      }

      else if (e.getSource()==jbtStop)
      {   
            System.out.println("Stop is pressed");
            if (task1 != null) {
                task1.cancel();
            }
            task2 = new Task2();
            timer.schedule(task2, 0, delay);
      }
...