2012-01-18 93 views
0

我有一个关于定时器功能的问题。我设法找到了我的问题的原因,但我不确定如何解决它。我会给你一个我的功能的概述。它将首先执行cost()函数,后台线程正常工作。但是,我意识到我的cost()函数在开始时无法正确加载。其次,它是每60秒运行一次的程序,它也是失败的。我检查我的代码以获取我的cost()函数,如果我不使用定时器函数调用它,它会正常工作。它可以是我的Opencsv()函数吗?问题是由于计时器功能的限制,还是有办法解决这个问题?定时器功能未运行。 Java

public static void main(String[] args) { 
    launch(EVschedulerApp.class, args); 

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

    timer.scheduleAtFixedRate(new Cost() { 

     @Override 
     public void run() { 
     new Thread(new Runnable() { 
      public void run() { 
       File file = new File("D:/test.csv"); 
       if(file != null){ 
       try { 
        Opencsv csv = new Opencsv(); 

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

       } 
       else { 

       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) {} 
       } 
      } 
      }).start(); 
     } 

Opencsv类文件:

public class Opencsv { 

    public void Csvreader() throws IOException { 
    try { 
     // TODO code application logic here 

     CSVReader reader = new CSVReader(new FileReader("D:/Test.csv")); 

     String [] nextLine; 
     while ((nextLine = reader.readNext()) != null) { 
     // nextLine[] is an array of values from the line 
     System.out.println(nextLine[0] + " " + nextLine[1]+ " " + nextLine[2]+ " " + nextLine[3]); 
     } 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(Opencsv.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    } 
} 

成本类:

public class Cost extends TimerTask{ 

public void run() { 
Calendar rightNow = Calendar.getInstance(); 
Integer hour = rightNow.get(Calendar.HOUR_OF_DAY); 
if (hour==23) { 
try { 
    URL tariff = new URL("http://www.******.downloadRealtime=true"); 
      ReadableByteChannel tar = Channels.newChannel(Test.openStream()); 
      FileOutputStream fos = new FileOutputStream("Test.csv"); 
      fos.getChannel().transferFrom(tar, 0, 1<<24); 

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




    else { 

    } 
    } 

回答

0

我认为你的错误是你永远不会打电话Costrun()方法,你不只是覆盖它,你隐藏它。尝试这样的:

timer.scheduleAtFixedRate(new Cost() { 
    @Override 
    public void run() { 

    super.run(); //Added this call to Cost's original method. 

    new Thread(new Runnable() { 
     public void run() { 
      //your code still here 
     } 
     }).start(); 
    } 

虽然,正如其他人指出,你应该看看执行服务。

+0

我添加了super.run(),但它没有工作,我会尝试执行程序服务 – Eugene 2012-01-18 16:19:41

0

看来你的错误是在你没有张贴在这里Cost类。

但无论如何,你还有另一个问题在这里。为什么在计时器任务的run()内部创建另一个线程。只有您的业务逻辑花费大量时间,它才有意义。在你的情况下,如果你的csv文件非常大。

从简单的实现开始。创建同步取消CSV的任务。安排它,看看它是如何工作的。当且仅当你看到该任务花费了大量时间关于使用另一个线程的事情。在这种情况下,请看Executors

+0

我将我的cost()函数添加到顶部 – Eugene 2012-01-18 15:44:06

+0

我的csv大约8kb,并不那么大,但我添加了后台线程,因为没有它,函数不会解析我的csv文件。 – Eugene 2012-01-18 16:03:26

1

我真的认为你的“bug”不在这里,而是在别的地方。你也应该真正关注的

ScheduledThreadPoolExecutor 

,而不是定时的,这将是这样的:

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); 
executor.scheduleAtFixedRate(new Runnable() { 

    @Override 
    public void run() { 
    //Do your stuff in here 
    } 
}), 60, TimeUnit.SECONDS); 

也可能我建议不要吞下InterruptedExceptions - 这里有很多帖子关于这个问题的SO。

干杯, 尤金。

+0

我刚刚添加了我的费用类代码,你可以看看吗?谢谢! – Eugene 2012-01-18 15:47:53