2012-01-13 2 views
1

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

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 до конца кода затрат, а другой метод, который я пытался добавлялось какое-то время (правда) мой основной ...

+0

хороший «творческий» стиль отступа. –

+0

Как это связано с решением проблемы? – Eugene

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

Edit 2
Опять же, ваш вопрос имеет «свинг» тег предполагая, что ваш вопрос включает в себя код, который является частью графического интерфейса Swing. Если это так, тогда рекомендации могут быть разными, особенно если какой-либо из вашего кода нужно вызвать в потоке событий Swing.

+0

ОК, я все еще это выясняю ... Я новичок в фоновом потоке, позвольте мне попытаться включить в мой код – Eugene

+0

@EugeneWong: снова у вашего вопроса есть тэг «свинг», предполагающий, что ваш вопрос включает код, который является частью графического интерфейса Swing. Если это так, тогда рекомендации могут быть разными, особенно если какой-либо из вашего кода нужно вызвать в потоке событий Swing. –

+0

Ah..I удалось понять и заставить его работать. Большое спасибо! Я очень ценю вашу помощь! Наконец я могу наконец спать. Еще раз спасибо! – Eugene

Смежные вопросы