【问题标题】:Java scheduled task to keep running in an interval repeatedly, in backgroundJava计划任务在后台重复运行
【发布时间】:2018-10-11 05:01:00
【问题描述】:

我希望我的主程序在updateRecord 方法在后台运行时继续执行。 updateRecord 方法在一个时间间隔内不断更新一条记录的过期时间。

这是我的updateRecord 方法。

    public void updateRecord(LeaderRecord leader) {
      LeaderRecord record = data.get(leader.getType());
      synchronized (this) {
        if (leader.getId().equals(record.getId()) || leader.getVersion() == record.getVersion()) {
          Runnable runnable = () -> {
            calendar.add(Calendar.SECOND, timeLimit);
            leader.setExpiryTime(new Timestamp(calendar.getTime().getTime()));
            data.put(leader.getType(), leader);
            System.out.println(record.getExpiryTime());
          };
          ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
          service.scheduleAtFixedRate(runnable, 0, timeLimit, TimeUnit.SECONDS);
        }
      }
    }

此代码在打印一次时间后停止运行。 我应该怎么做才能让它在主应用程序执行时继续在后台运行? 提前谢谢!

【问题讨论】:

标签: java multithreading


【解决方案1】:

考虑使用计时器。它们应该是您正在寻找的东西。它与您正在做的事情相似,但它具有您正在寻找的所有功能。

public static void updateRecord(LeaderRecord leader) {
    long timeLimit = 5000;//ms
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            calendar.add(Calendar.SECOND, timeLimit);
            leader.setExpiryTime(new Timestamp(calendar.getTime().getTime()));
            data.put(leader.getType(), leader);
            System.out.println(record.getExpiryTime());
        }
    }, 0, timeLimit);// Delay, Time Between in ms
}

我希望这会有所帮助。

【讨论】:

  • 谢谢,我试过了,但是执行一次后就停止了。我希望它继续重复运行。
  • 这是要走的路。您的方法和此方法现在不起作用的原因是它们是未在某处捕获的异常。对于初学者,删除 run() 覆盖中的所有内容,并简单地让它控制台输出一个类似“RUN”的字符串。这应该让间隔继续
【解决方案2】:

使用java.util.Timer 以设定的时间间隔运行任务。

Timer t = new Timer();
t.schedule(new TimerTask() { //(TimerTask task, long delay, long period)
    @Override
    public void run() {
        updateRecord(leader);
    }
}, 0, 3600000); //delay = 0, interval in milliseconds

这将使程序永远运行,直到您停止它。使用

t.cancel();
t.purge();

停止Timer

System.exit(0);

终止应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多