Java 计划在定期时间运行方法´;

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

我必须安排一个方法在启动时执行,然后每隔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();
        }
    }
};

因为
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:我不知道!这是个谜!我想,当我回答这个问题时,我只是假设海报的类型已经分类了