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

时间:2011-05-24 14:03:16

标签: java multithreading timer futuretask

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

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

  2. 使用Executors.newScheduledThreadPool(1)

    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    ScheduledFuture <?> scheduleHandle = scheduler.schedule(pushExternalRunnable,  
            runScheduleDate.getTime() - now.getTime(), TimeUnit.MILLISECONDS);
    
  3. 将来安排工作的这两种方式之间有什么区别?

2 个答案:

答案 0 :(得分:27)

最大的区别是Timer会在一个后台线程上安排所有任务。另一方面,ExecutorService将创建新线程(如果需要)以运行任务(最多达到您指定的池的大小,此时任务将排队。)

答案 1 :(得分:15)

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

如果您希望与进度交互,ScheduledExecutor还会产生一个未来。