12

我需要安排一些将来要完成的工作。我可以通过两种方式做到这一点:

  1. 创建TimerTask并执行timer.schedule(...);

  2. 使用Executors.newScheduledThreadPool(1)

    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    ScheduledFuture <?> scheduleHandle = scheduler.schedule(pushExternalRunnable,  
            runScheduleDate.getTime() - now.getTime(), TimeUnit.MILLISECONDS);
    

这两种安排未来工作的方式有什么区别?

4

2 回答 2

29

最大的不同是 Timer 将把它的所有任务安排在一个后台线程上。另一方面,ExecutorService 将创建新线程(如有必要)来运行任务(直到您指定的池大小,此时任务将排队。)

于 2011-05-24T14:09:45.267 回答
15

另一个区别是是否存在未捕获的异常。在 Timer 的情况下,后台线程会终止,但不会重新启动。使用 ScheduledExecutor(即使是单线程配置),ScheduledExecutor 可以在未捕获的异常之后继续。它试图确保正在运行所需数量的线程来处理任务。

如果您想与进度交互,ScheduledExecutor 还会生成未来。

于 2011-05-24T16:31:34.653 回答