Java中的定时任务?

4
我需要在Java中完成计时器任务。场景是:我需要对某个延迟进行任务调度。如果我点击了一个按钮,它将取消当前定时器,然后重新安排任务。如何在Java中实现?
当我使用cancel()时,我无法再次访问定时器。也就是说,我不能重用该对象。我已经将TimerTimertask声明为静态。
提前致谢。
3个回答

7
我能想到最简单的实现方式是使用一个执行器。 比如说,你想要安排一个任务在30秒后运行:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(new Task(), 30, TimeUnit.SECONDS);

Task必须是实现Runnable接口的类:

class Task implements Runnable
{
    public void run()
    {
        // do your magic here
    }
}

如果您需要停止任务的执行,可以使用shutdownNow方法:

// prevents task from executing if it hasn't executed yet
scheduler.shutdownNow(); 

如果我安排一个新任务,那么之前的调度程序会停止/终止其进程吗? - Praveen
这取决于你如何使用它。 - Pablo Santa Cruz
如何做到这一点?当我关闭调度器对象时,我无法为该对象安排另一个任务? - Praveen
scheduler.schedule() 返回一个 Future 对象,你只需要记住这个 Future 并使用它的 cancel() 方法从 Executor 中移除单个任务,然后可以安排一个新的任务。你不必每次都创建一个新的 Executor。只需在按钮被点击时取消旧任务并安排新任务即可。 - Reboot

2
只要它们没有被声明为“final”,就创建新实例。

我没有将它声明为final,只是声明为静态的。 - Praveen

1

此外,还有Quartz API可供使用。在集群环境中,它将为您提供更多的灵活性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接