计划在定期时间运行方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计划在定期时间运行方法相关的知识,希望对你有一定的参考价值。

我必须安排一个方法在开始时执行,之后每隔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将成为该类型的对象。

另一答案

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

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

以上是关于计划在定期时间运行方法的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008如何创建定期自动备份任务

使用 Flask 运行计划时的问题

在贝宝(贝宝订阅)中首次定期付款时应用折扣优惠券代码

建议paypal的定期付款方式

Worklight :: 有计划任务吗?

贝宝定期付款计划修改