【问题标题】:Schedule to run a method at periodic time´安排定期运行方法'
【发布时间】:2015-06-15 07:19:41
【问题描述】:

我必须安排一个方法在启动时执行,然后每隔 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 是什么吗?
  • 我这样做了,因此编写了我在编辑中添加的代码。但是即使文档清楚地说明了参数,它仍然会出错: scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
  • 如果文档指定了 4 个参数,而你只给了 3 个,那么显然不会编译
  • 然而 eclipse 提供了以下提示:Timer 类型中的方法 scheduleAtFixedRate(TimerTask, long, long) 不适用于参数(Runnable, int, int, TimeUnit)。因此,我假设最后一个参数是可选的。
  • 我猜你使用了错误的文档。你用的是什么定时器?您使用的是什么类型的文档?

标签: java methods timer scheduler runnable


【解决方案1】:

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

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

Lambda 表达式是 Java 8 的一项新功能。

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

由于 scheduleAtFixedRate 需要 Runnable 作为参数,这将是表达式的目标类型,而 lambda 将成为该类型的对象。

【讨论】:

  • 这看起来是一个非常简洁的解决方案。谢谢。我想我需要了解更多关于 Lambda 表达式的知识才能理解这个解决方案。
  • @aayush_v20:它们确实非常整洁!我加了一点解释。
  • 那是哪个Timer 类? java.util.Timer 没有scheduleAtFixedRate 的重载,接受 4 个参数...
  • @sillyfly:我不知道!这是一个谜!我想,当我回答这个问题时,我只是假设海报的类型分类正确,所以我展示了如何使用 lambda 而不是匿名类来做他们想做的事。我猜他们在接受之前从未检查过代码是否有效。对于读者来说,这里的代码不起作用是非常令人困惑的。我应该修复这个答案或删除它。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的帮助。不幸的是,这是我已经尝试过的(我之前没有在我的帖子中包含此尝试是我的错误)并且它仍然给出错误。我不明白为什么可运行参数会给出此错误:Timer 类型中的方法 scheduleAtFixedRate(TimerTask, long, long) 不适用于参数 (Runnable, int, int)
猜你喜欢
  • 2017-12-13
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2016-06-12
  • 2014-11-06
相关资源
最近更新 更多