创建循环计时器

本文关键字:计时器 循环 创建 | 更新日期: 2023-09-27 18:17:38

我的任务是创建一个c# SDK的Java版本。目前。我正在开发一个扩展c# System.ServiceProcess.ServiceBase的类,但由于在Java中创建Windows服务的困难,我将重点放在类中的其他一些方法上。

我试图在Java中复制的当前c#方法如下所示

    private void StartProcesses()
    {
        // create a new cancellationtoken souce
        _cts = new CancellationTokenSource();
        // start the window timer
        _windowTimer = new Timer(new TimerCallback(WindowCallback),
            _cts.Token, 0, Convert.ToInt64(this.SQSWindow.TotalMilliseconds));
        this.IsWindowing = true;
    }
在分析了这段代码之后,我认为它初始化了一个System.threading.Timer对象,该对象每SQSWindow毫秒执行一次WindowCallback函数。

在阅读位于

的java.util.concurrent文档之后http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html

我不确定如何在Java中复制c#功能,因为我找不到与Timer功能等效的功能。Java库提供的TimeUnit似乎只用于线程超时,而不用于发出循环操作。

我也很好奇CancellationTokenSource的使用。如果要查询该对象以确定是否要继续操作,为什么它不是像布尔这样的原语?它提供了哪些额外的功能,Java的多线程模型中是否有类似的结构?

创建循环计时器

使用ScheduledThreadPoolExecutor,您可以获得非常相似的功能:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
Runnable task = new Runnable() {
    public void run() {
        //here the code that needs to run periodically
    }
};
//run the task every 200 ms from now
Future<?> future = scheduler.scheduleAtFixedRate(task, 0, 200, TimeUnit.MILLISECONDS);
//a bit later, you want to cancel the scheduled task:
future.cancel(true);

您可能想要查看ScheduledThreadPoolExecutor。它是ScheduledExecutorService的实现,具有定期调度的能力。

对应的Java类是' Timer '和' TimerTask '。

的例子:

Timer t = new Timer();
t.schedule(new TimerTask(){
    @Override
    public void run() {
        // Do stuff
    }
}, startTime, repeatEvery);

如果您希望能够取消,那么使用TimerTask作为变量。TimerTask类的方法为cancel