我必须安排一个方法在开始时执行,之后每隔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();
}
}
};
使用以下语法,您可以创建一个lambda表达式,该表达式将计算为Runnable
类型的对象。当调用该对象的run
方法时,将调用loadConfig
方法。
scheduler.scheduleAtFixedRate(() -> loadConfig(), 60, 60, TimeUnit.SECONDS);
Lambda表达式是一种新的Java 8特性。
在这种情况下,它的工作方式如下:箭头->
将表达式转换为lambda。 ()
是参数列表,它是空的,因为run
方法没有参数。箭头后面的loadConfig()
是身体,其工作方式与方法体相同。
由于scheduleAtFixedRate
期望将Runnable
作为参数,这将是表达式的目标类型,并且lambda将成为该类型的对象。
由于Runnable
是an interface,因此您需要提供实现该接口的对象。最简单的方法(不一定是最干净的)是编写一个实现该接口的匿名内部类。
在编写该对象时,您将看到必须实现run()
方法。在该方法中,您可以简单地调用周围对象的loadConfig()
方法。