Таймер повторного выполнения выполняется только один раз - PullRequest
1 голос
/ 14 января 2012

У меня есть задание, которое должно выполняться каждые 10 секунд.Это работает, когда я просто запускаю проект, то есть он будет запускаться () один раз, но не будет в следующий раз.Может кто-нибудь сказать мне, какая часть неправильна .. Я потратил часы, пытаясь решить эту проблему, но безрезультатно :( Это мое основное:

public static void main(String[] args)  {

    launch(TestingApp.class, args);


    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new Cost(), 10*1000, 10*1000);}

Это код стоимости:

public class Cost extends TimerTask {

   public void run() {
      Calendar rightNow = Calendar.getInstance();
      Integer hour = rightNow.get(Calendar.HOUR_OF_DAY);

      if (hour == 3) {
         try {

            File file = new File("D:/TESTAPP/Testing.csv");
            if (file != null) {
               Opencsv csv = new Opencsv();

               csv.Csvreader();

            }
         } catch (IOException ex) {
            Logger.getLogger(Cost.class.getName()).log(Level.SEVERE, null, ex);
         }
      }

      else {

      }
   }
}

Некоторые из методов, которые я пробовал, заканчивали thread.sleep до конца кода Cost, а другой метод, который я пробовал, был добавлен некоторое время (правда) в мой основной ...

1 Ответ

3 голосов
/ 14 января 2012

Я подозреваю, что это:

Opencsv csv = new Opencsv();
csv.Csvreader();

блокирует поток таймера.Вы пытались сделать это в фоновом потоке?

Например, ваш код эквивалентен этому:

import java.util.Timer;
import java.util.TimerTask;

public class TestTimer {
   public static void main(String[] args) {
      Timer timer = new Timer();
      timer.scheduleAtFixedRate(new TimerTask() {

         @Override
         public void run() {
           System.out.println("here");
           try {
              Thread.sleep(10 * 1000);
           } catch (InterruptedException e) {}
         }
      }, 1000, 1000);
   }
}

Я предлагаю вместо этого сделать внутреннюю работу в фоновом потокечтобы не замедлять таймер.Обратите внимание на разное время выполнения этого:

import java.util.Timer;
import java.util.TimerTask;

public class TestTimer {
   public static void main(String[] args) {
      Timer timer = new Timer();
      timer.scheduleAtFixedRate(new TimerTask() {

         @Override
         public void run() {
            new Thread(new Runnable() {
               public void run() {
                  System.out.println("here");
                  try {
                     Thread.sleep(10 * 1000);
                  } catch (InterruptedException e) {}
               }
            }).start();
         }
      }, 1000, 1000);
   }
}

Редактировать 2
Опять же, ваш вопрос имеет тег "swing", предполагающий, что ваш вопрос включает в себя код, который является частьюSwing GUI.Если это так, то рекомендации, возможно, должны отличаться, особенно если любой ваш код должен вызываться в потоке событий Swing.

...