1

我有一个预期的任务,应该每 10 秒执行一次。当我只运行项目时它就可以工作,这意味着它会 run() 一次,但以后不会。有人可以告诉我哪一部分是错的。我花了几个小时试图解决这个问题但无济于事:(这是我的主要内容:

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 代码的末尾,而我尝试的另一种方法是在我的 main...

4

1 回答 1

3

我怀疑这是:

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

我建议您改为在后台线程中执行内部操作,以免减慢 Timer 的速度。请注意执行此操作的不同时间:

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 事件线程上调用。

于 2012-01-13T20:19:06.640 回答