TimerTask 和 Executors 之间的区别。newScheduledThreadPool(1)

2022-09-05 00:08:26

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

  1. 创建并执行TimerTasktimer.schedule(...);

  2. 用:Executors.newScheduledThreadPool(1)

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

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


答案 1

最大的区别是计时器将在单个后台线程上计划其所有任务。另一方面,ExecutorService将创建新线程(如有必要)来运行任务(最大可达您指定的池的大小,此时任务将排队)。


答案 2

另一个区别是是否存在未捕获的异常。对于计时器,后台线程将终止,但不会恢复。使用 ScheduledExecutor(即使使用单线程配置),ScheduledExecutor 可以在未捕获的异常后继续。它尝试确保正在运行所需数量的线程来处理任务。

ScheduledExecutor 还会生成一个未来,以防您想要与进度进行交互。