Java中是否有与Python sched模块等效的东西?

3 投票
5 回答
702 浏览
提问于 2025-04-17 11:08

Raymond Hettinger 发了一段代码,里面用到了 Python 标准库中的 sched 模块,这个模块可以让你以特定的频率(每秒 N 次)调用函数。我在想,Java 有没有类似的库呢?

5 个回答

2

一个轻量级的选择是 ScheduledExecutorService

与这个Python代码片段大致相当的Java代码如下:

private final ScheduledExecutorService scheduler = 
       Executors.newScheduledThreadPool(1);

public ScheduledFuture<?> newTimedCall(int callsPerSecond, 
    Callback<T> callback, T argument) {
    int period = (1000 / callsPerSecond);
    return 
        scheduler.scheduleAtFixedRate(new Runnable() {
            public void run() {
                callback.on(argument);
            }
        }, 0, period, TimeUnit.MILLISECONDS);
}

留给读者的练习:

  • 定义一个回调接口
  • 决定如何处理返回的未来对象
  • 记得关闭执行器
5

看看这个网站:http://quartz-scheduler.org/

Quartz是一个功能齐全的开源任务调度服务,可以和几乎所有的Java EE或Java SE应用程序一起使用,或者单独使用。无论是最小的独立应用程序,还是最大的电子商务系统,它都能很好地工作。

4

看看 java.util.Timer 这个类。

你可以在 这里 找到一个使用的例子。

你也可以考虑使用 Quartz,它功能更强大,可以和 Spring 一起使用。这里有一个 例子

这是我用 java.util.Timer 实现的你提到的代码片段的等效代码。

package perso.tests.timer;

import java.util.Timer;
import java.util.TimerTask;

public class TimerExample  extends TimerTask{

      Timer timer;
      int executionsPerSecond;

      public TimerExample(int executionsPerSecond){
          this.executionsPerSecond = executionsPerSecond;
        timer = new Timer();
        long period = 1000/executionsPerSecond;
        timer.schedule(this, 200, period);
      }

      public void functionToRepeat(){
          System.out.println(executionsPerSecond);
      }
        public void run() {
          functionToRepeat();
        }   
      public static void main(String args[]) {
        System.out.println("About to schedule task.");
        new TimerExample(3);
        new TimerExample(6);
        new TimerExample(9);
        System.out.println("Tasks scheduled.");
      }
}

撰写回答