1

我的任务是创建 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 的多线程模型中是否有类似的构造?

4

3 回答 3

2

使用 a 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);
于 2013-06-07T19:40:08.300 回答
1

等效的 Java 类是TimerTimerTask

例子:

Timer t = new Timer();
t.schedule(new TimerTask(){

    @Override
    public void run() {
        // Do stuff
    }

}, startTime, repeatEvery);

如果您希望能够取消,则将TimerTask用作变量。该类TimerTask有方法cancel

于 2013-06-07T19:22:06.973 回答
1

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

于 2013-06-07T19:23:53.577 回答