executorService.scheduleAtFixedRate永远运行任务

时间:2015-09-30 07:45:08

标签: java concurrency scheduledexecutorservice

我希望任务在1分钟的间隔后永久运行。要完成我在

中写下我的任务
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();

}

但是任务只执行一次,而不是每分钟后执行一次。 我不明白这里有什么不对。

4 个答案:

答案 0 :(得分:2)

在执行代码时,NullPointerException导致for (File file : listOfFiles) {导致线程被终止。

以下更改使其持续运行:

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

此外,files.cancel(false)结束执行。因此,不得不评论这一行。参考Future.cancel()

答案 1 :(得分:1)

测试代码。正如其他人所假设的那样,结果如下: 删除行

files.cancel(false);

让它每分钟运行一次。否则它只运行一次。

这是我的测试代码,有效:

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

我的run()函数只包含一个System.out.println,所以你应该在run()方法中检查你的代码。如果它包含错误,它将中止整个执行。

答案 2 :(得分: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);
}

答案 3 :(得分:0)

我打赌你在Runnable中得到一个未经检查的异常。以下代码打印&#34; Running&#34;恰好一次:

run()

你应该在 @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(); } } 方法的所有内容周围放置一个try / catch块,看看你抓到了什么。

$app->group('/Admin', function () use ($app) { // crée un "groupe d'URL"

    $app->get('/users', function () use ($app){
        if(isset($_SESSION["type"]) && $_SESSION["type"] == "admin") {
            $ctrl = new UserController();
            $ctrl->listing($app);
        }else{
            $app->redirect($app->urlFor('indexAdmin'));
        }
    })


    $app->get('/users', function () use ($app){
        if(isset($_SESSION["type"]) && $_SESSION["type"] == "admin") {
            $ctrl = new UserController();
            $ctrl->listing($app);
        }else{
            $app->redirect($app->urlFor('indexAdmin'));
        }
    })