Java 计划在定期时间运行方法´;
我必须安排一个方法在启动时执行,然后每隔1分钟定期执行 为此,我做了以下工作:Java 计划在定期时间运行方法´;,java,methods,timer,scheduler,runnable,Java,Methods,Timer,Scheduler,Runnable,我必须安排一个方法在启动时执行,然后每隔1分钟定期执行 为此,我做了以下工作: public void init(){ loadConfig(); //method which needs to be executed periodically Timer scheduler = new Timer(); scheduler.scheduleAtFixedRate(loadConfig(),60000,60000); } 这是一个错误,应该是因为scheduleAtF
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();
}
}
};
因为
Runnable
是,所以需要提供一个实现该接口的对象。最简单的方法(不一定是最干净的)是编写一个实现该接口的匿名内部类
在编写该对象时,您将看到必须实现
run()
方法。在该方法中,您只需调用周围对象的loadConfig()
方法。由于Runnable
是,您需要提供一个实现该接口的对象。最简单的方法(不一定是最干净的)是编写一个实现该接口的匿名内部类
在编写该对象时,您将看到必须实现
run()
方法。在该方法中,您只需调用周围对象的loadConfig()
方法。使用以下语法,您可以创建一个lambda表达式,该表达式将计算为类型为Runnable
的对象。当调用该对象的run
方法时,将调用loadConfig
方法
scheduler.scheduleAtFixedRate(() -> loadConfig(), 60, 60, TimeUnit.SECONDS);
Lambda表达式是Java8的一个新特性
在本例中,它的工作原理如下:箭头->
,将表达式转换为lambda()
是参数列表,该列表为空,因为run
方法没有参数。箭头后面的loadConfig()
是主体,其工作方式与方法主体相同
由于
scheduleAtFixedRate
需要一个Runnable
作为参数,因此它将是表达式的目标类型,lambda将成为该类型的对象。使用以下语法,您可以创建一个lambda表达式,该表达式将计算为Runnable
类型的对象。当调用该对象的run
方法时,将调用loadConfig
方法
scheduler.scheduleAtFixedRate(() -> loadConfig(), 60, 60, TimeUnit.SECONDS);
Lambda表达式是Java8的一个新特性
在本例中,它的工作原理如下:箭头->
,将表达式转换为lambda()
是参数列表,该列表为空,因为run
方法没有参数。箭头后面的loadConfig()
是主体,其工作方式与方法主体相同
由于
scheduleAtFixedRate
需要一个Runnable
作为参数,因此它将是表达式的目标类型,lambda将成为该类型的对象。您使用的是什么计划程序?你在谷歌上搜索过什么是可运行的吗?我搜索过了,因此写下了我在编辑中添加的代码。但是,即使文档清楚地说明了参数,它仍然会给出一个错误:scheduleAtFixedRate(Runnable命令,long initialDelay,long period,TimeUnit),如果文档指定了4个参数,而您只给出了3个,它显然不会编译,但eclipse提供了以下提示:Timer类型中的scheduleAtFixedRate(TimerTask,long,long)方法不适用于参数(Runnable,int,int,TimeUnit)。因此,我假设最后一个参数是可选的。我猜您使用了错误的文档。你用的是哪种定时器?您使用的是哪种文档?您使用的是哪种调度程序?你在谷歌上搜索过什么是可运行的吗?我搜索过了,因此写下了我在编辑中添加的代码。但是,即使文档清楚地说明了参数,它仍然会给出一个错误:scheduleAtFixedRate(Runnable命令,long initialDelay,long period,TimeUnit),如果文档指定了4个参数,而您只给出了3个,它显然不会编译,但eclipse提供了以下提示:Timer类型中的scheduleAtFixedRate(TimerTask,long,long)方法不适用于参数(Runnable,int,int,TimeUnit)。因此,我假设最后一个参数是可选的。我猜您使用了错误的文档。你用的是哪种定时器?您使用的是哪种文档?谢谢您的帮助。不幸的是,这是我已经尝试过的(糟糕的是,我没有在我的帖子中包含这一尝试),它仍然给出了一个错误。我不明白为什么runnable参数会出现这个错误:Timer类型中的scheduleAtFixedRate(TimerTask,long,long)方法不适用于参数(runnable,int,int),谢谢您的帮助。不幸的是,这是我已经尝试过的(糟糕的是,我没有在我的帖子中包含这一尝试),它仍然给出了一个错误。我不明白为什么runnable参数会给出这个错误:Timer类型中的scheduleAtFixedRate(TimerTask,long,long)方法不适用于参数(runnable,int,int),这看起来是一个非常简洁的解决方案。谢谢我想我需要学习更多关于Lambda表达式的知识才能理解这个解决方案。@aayush_v20:它们确实非常整洁!我加了一点解释。那是哪个Timer
类?java.util.Timer
one没有超负荷的scheduleAtFixedRate
接受4个参数…@sillyfly:我不知道!这是个谜!我想,当我回答这个问题时,我只是假设海报的类型已经分类了