TimerTask启动停止只执行一次

时间:2011-10-03 06:03:55

标签: java timertask

问题,我只能执行一次计时器。我知道它是因为我调用了函数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 个答案:

答案 0 :(得分:2)

为什么不在此时创建新的Timer?或者,或者保持TimerTask以及计时器,并取消那个而不是计时器本身。

作为第三个可能的替代方案,拥有一个计时器任务和一个计时器,但让计时器任务知道它在任何时候的意图 - 看起来你有效地切换每次计时器滴答时你想做什么。您可以始终保留两个单独的类来分隔逻辑功能,然后有一个“包装器”任务,它允许您替换每次运行时执行的行为。

答案 1 :(得分:1)

我会取消TimerTasks而不是Timers(我只使用一个Timer)。

更新:

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