2012-01-18 94 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