2012-01-18 19 views
0

私はタイマー機能に関する質問があります。私は自分の問題の原因を見つけることができましたが、それに対処する方法がわかりません。私はあなたに私の機能の概要を伝えます。バックグラウンドスレッドを使用して、まずcost()関数を実行します。しかし、私が気づいているのは、私のcost()関数が最初に正しく読み込まれなかったことです。第二に、失敗した60秒ごとに実行するプログラムです。私は私のコスト()関数のために私のコードをチェックし、私はタイマー機能なしでそれを呼び出す場合は正常に動作します。それは私の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()を追加しましたが、動作しませんでした。私はexecutorサービス – Eugene

0

あなたのバグはあなたがここに掲載されていないクラスCostであるようです。

しかし、とにかくここにはもう一つの問題があります。なぜタイマータスクのrun()の中に別のスレッドを作成しますか?ビジネスロジックにかなりの時間がかかる場合にのみ意味をなさないかもしれません。あなたの場合、csvファイルが非常に大きい場合。

簡単な実装から始めます。 CSVを同期的にパースするタスクを作成します。それをスケジュールし、どのように動作しているかを確認してください。もしあなたがそのタスクを見ているのであれば、別のスレッドを使用することについて多くの時間を要します。この場合はExecutorsをご覧ください。

+0

私のコスト()関数をトップに追加します – Eugene

+0

私のcsvは約8kbですが、大きくはありませんが、それがなければ関数は私のcsvファイルを解析しないためバックグラウンドスレッドを追加しました。 – Eugene

1

あなたの「バグ」はここにはなく、どこかにあると思っています。ポストの多くはここにある - また、私はInterruptedExceptionsを飲み込むしない勧告することができる

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

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

:また、あなたが本当に代わりにタイマーの

ScheduledThreadPoolExecutor 

されているはずです、それはこのようなものになるだろうこの主題のSOに。

乾杯、 ユージン。

+0

コストクラスコードを追加しました。どうぞご覧ください。ありがとう! – Eugene

関連する問題