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コードの最後まで終了することでしたが、私が試した他の方法は、しばらくの間(true)私のメインに追加されました...

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

代わりに、タイマーの速度を落とさないように、バックグラウンドスレッドで内部処理を行うことをお勧めします。これの実行の異なる時間に注意してください:

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」タグがあり、質問にSwingGUIの一部であるコードが含まれていることを示しています。その場合、特にSwingイベントスレッドでコードを呼び出す必要がある場合は、推奨事項を変える必要があります。

于 2012-01-13T20:19:06.640 に答える