2015-09-30 21 views
5

1分後に永久にタスクを実行したい。達成するために私は自分の仕事を書いたexecutorService.scheduleAtFixedRate永久にタスクを実行する

public void poll() { 
    ScheduledExecutorService executorService= Executors.newScheduledThreadPool(1); 
    ScheduledFuture files=executorService.scheduleAtFixedRate(new Runnable() {  
     @Override 
     public void run() { 
      String path="/Desktop/PNL/Test"; 
      List<String> filesPaths= new ArrayList<String>(); 
      File folder= new File(path); 
      File[] listOfFiles= folder.listFiles(); 
      for (File file : listOfFiles) { 
       filesPaths.add(file.getAbsolutePath()); 
      } 
      if(!CollectionUtils.isEmpty(filesPaths)){ 
       try{ 
        update(filesPaths); 
       } 
       catch(Exception e){ 
        System.out.println(e.toString()); 
       } 
      } 
     } 
    }, 0, 1, TimeUnit.MINUTES); 
    files.cancel(false); 
    //executorService.shutdown(); 

} 

しかし、タスクは1分だけ実行され、1分後には実行されません。 ここで何が間違っているのか分かりません。

+0

残りのコードは表示できますか?一見して、私はそれがあなたがそれをどのように呼び出すのかという問題であるかもしれないと思います。 – Dibesjr

+6

その行 'files.cancel(false);'とは何ですか?スケジュールされたタスクをキャンセルすると、明らかにもう実行されません。 – Jesper

+0

@Dibesjrはコード –

答えて

0

編集:私はそう

public static void main(String[] args) { 
    ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); 
    Runnable files = new Runnable() { 
     @Override 
     public void run() { 
      // Replace with your original code.. this was just a test to make sure it worked 
      System.out.println("Hello"); 
     } 
    }; 

    // Set this back to minutes, seconds was easier to test 
    ScheduledFuture<?> scheduledFuture = executorService.scheduleAtFixedRate(files, 0, 1, TimeUnit.SECONDS); 
} 
+0

起動しなかった場合、どのように実行しますか? –

+0

ファイルのstart()オプションがありません。 –

+0

私は@shrutirawatの最後で動作するコードでそれを更新しました – Dibesjr

0

のように動作するようにコードを再構築分間小さな砂場で遊んでいた後、私はあなたのRunnableでチェックされない例外を取得していることを賭けます。一度だけ「実行」次のコードを印刷:

import java.io.*;                      
import java.util.concurrent.*;                  

public class Foo {                     
    public static void main(String[] args) {               
    ScheduledExecutorService executorService= Executors.newScheduledThreadPool(1);     
    ScheduledFuture files=executorService.scheduleAtFixedRate(new Runnable() {      
     @Override                      
     public void run() {                    
     System.out.println("Running");                
     throw new RuntimeException("bar");               
     }                        
    }, 0, 1, TimeUnit.SECONDS);                  
    }                         
} 

あなたのrun()方法で、すべての周りにtry/catchブロックを置くと、あなたがキャッチ何を見るべきです。

 @Override                      
     public void run() { 
     try {                    
      System.out.println("Running");                
      throw new RuntimeException("bar");               
     } catch (RuntimeException e) { 
      // Do something better here, but for the sake of highlighting the issue: 
      e.printStackTrace(); 
     } 
     }  
2

あなたのコードを実行中に、スレッドを殺したfor (File file : listOfFiles) {に生じるNullPointerExceptionがありました。

次の変更は、それが継続的に実行製:

if (listOfFiles != null) { 
    for (File file : listOfFiles) { 
     filesPaths.add(file.getAbsolutePath()); 
    } 
} 

はまた、files.cancel(false)は実行を終了します。したがって、この行をコメントしなければならなかった。参考資料Future.cancel()

1

コードをテストしました。他の人が想定しているように、結果は次のとおりです。 は

files.cancel(false); 

行を削除すると、それは毎分を実行します。それ以外の場合は1回だけ実行されます。

ここ

がこれは動作しますが、テストのために私のコードです:

import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.ScheduledFuture; 
import java.util.concurrent.TimeUnit; 

public class PeriodicCall { 

public static void main(String args[]) { 
    new PeriodicCall().poll(); 
} 

public void poll() { 
    System.out.println("poll"); // called once 
    ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); 
    ScheduledFuture<?> files = executorService.scheduleAtFixedRate(new Runnable() {  
     public void run() { 
      System.out.println("running"); 
     } 
    }, 0, 1, TimeUnit.MINUTES); 
    //files.cancel(false); 
    //executorService.shutdown(); 
} 
} 

マイラン()関数は、唯一のSystem.out.printlnが含まれているので、あなたのrun()メソッド内のコードを確認する必要があります。エラーがあれば、実行全体を中止します。

関連する問題