定时器不会因if else而停止

时间:2013-11-23 21:08:26

标签: java timer timertask

public static void randomN () {
    int requestTime = 2;
    if(requestTime > 0) {
      requestTime--;  
      myTimer.scheduleAtFixedRate(new TimerTask() {
              public void run() {
                int randomx = (int) (Math.random()*6+1);
                int randomy = (int) (Math.random()*6+1);
                System.out.println("Requests" + "X : " + randomx + " Y: " + randomy);
              }
      }, 0, 1000);
    } else {
          myTimer.cancel();
          myTimer.purge();
    } 
}

我希望我的计时器在public void run(){...}中执行任务,并且每秒执行2秒。但是这段代码不能正常工作。

4 个答案:

答案 0 :(得分:1)

在此代码中:

public static void randomN () {
    int requestTime = 2;
    if(requestTime > 0) { //..

你的requestTime在if语句时总是2,无论你调用方法多少次。我想你想要

static int requestTime = 2;
public static void randomN () {
    if(requestTime > 0) { //..

答案 1 :(得分:1)

你不会停止,因为你在requestTime开始之前只减少了一次Timer。计时器仅使用您给出的时间段重复执行run()方法内的代码。因此,如果您想要更新requestTime,则必须使用run()方法进行更新。

        final int requestTime = 2; 
        final Timer timer = new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {
         int aRequestTime = requestTime; 
           @Override
           public void run() {
               if(aRequestTime > 0)
               {
                   aRequestTime--;
               }

               else timer.cancel();
           }
       }, 0, 2000);

尝试在Timer上下文中声明您的requestTimeClass而不是功能,以摆脱final变量。如您所知,本地内部类:Anonymous类不会更改局部变量。

答案 2 :(得分:1)

尝试在两次执行后从任务内部取消计时器,并将scheduleAtFixedRate(TimerTask,long,long)的最后一个参数更改为2000毫秒。也许第二个,如果你想在2秒后开始它。

final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    private int counter = 2;
    @Override
    public void run() {
        counter--;
        if(counter >= 0)
            System.out.println(counter + " more ticks to go.");
        else
            timer.cancel();
    }
}, 0, 2000);

答案 3 :(得分:0)

将代码修改为下一个:

private static volatile Timer myTimer = new Timer();
private static volatile int runTimes = 0;

public static void randomN () {
  myTimer.scheduleAtFixedRate(new TimerTask() {

          public void run() {
            runTimes++;

            printRandomXY();
            cancelTimerIfRunTwice();
          }
  }, 0, 1000);
}

private static void printRandomXY() {
   int randomx = (int) (Math.random()*6+1);
   int randomy = (int) (Math.random()*6+1);
   System.out.println("Requests" + "X : " + randomx + " Y: " + randomy);
}

private static void cancelTimerIfRunTwice() {
   if (runTimes == 2) {
       myTimer.cancel();
       myTimer.purge();
   }
}