计划在定期时间运行方法

问题描述 投票:0回答:2

我必须安排一个方法在开始时执行,之后每隔1分钟安排一次。

为此我做了这个:

public void init(){
    loadConfig(); //method which needs to be executed periodically

    Timer scheduler = new Timer();
    scheduler.scheduleAtFixedRate(loadConfig(),60000,60000);
}

这是一个错误,它应该是因为scheduleAtFixedRate的第一个参数是Runnable类型。

我需要建议的是,如何制作我的loadConfig方法Runnable,并且在我在调度程序启动之前执行loadConfig()时仍然执行它。

截至目前代码结构如下:

public class name {
    public void init() {
        ...
    }
    ...
    public void loadConfig() {
        ...
    }
}

编辑:这是我已经尝试过的

public void init(){
    loadConfig();

    Timer scheduler = new Timer();
    scheduler.scheduleAtFixedRate(task,60000,60000);
}

final Runnable task = new Runnable() {
    public void run() {
        try {
            loadConfig();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};
java methods timer scheduler runnable
2个回答
4
投票

使用以下语法,您可以创建一个lambda表达式,该表达式将计算为Runnable类型的对象。当调用该对象的run方法时,将调用loadConfig方法。

scheduler.scheduleAtFixedRate(() -> loadConfig(), 60, 60, TimeUnit.SECONDS);

Lambda表达式是一种新的Java 8特性。

在这种情况下,它的工作方式如下:箭头->将表达式转换为lambda。 ()是参数列表,它是空的,因为run方法没有参数。箭头后面的loadConfig()是身体,其工作方式与方法体相同。

由于scheduleAtFixedRate期望将Runnable作为参数,这将是表达式的目标类型,并且lambda将成为该类型的对象。


1
投票

由于Runnablean interface,因此您需要提供实现该接口的对象。最简单的方法(不一定是最干净的)是编写一个实现该接口的匿名内部类。

在编写该对象时,您将看到必须实现run()方法。在该方法中,您可以简单地调用周围对象的loadConfig()方法。

© www.soinside.com 2019 - 2024. All rights reserved.