1

最近收到一个面试题:

有一种情况,一个线程在一小时的间隔内执行批处理操作,你会使用执行器框架还是普通线程,为什么?

我很困惑 。

由于只有一个线程,因此不需要执行器服务。我可以使用while and来做到这一点sleep

while(1)
{
// do task
// t1.sleep(60*60*1000);
}

虽然有一个 ScheduleExecutorService 提供了这么多调度方法?

什么是最好的方法?

4

5 回答 5

6

您上面的解决方案的问题是,如果您的任务需要 59 分钟,那么您的线程将花费 59 分钟执行您的任务,然后休眠一个小时。因此,您将每(几乎)2 小时调用一次您的任务。

如果您使用预定的执行器框架,那么它将在每小时的时间(无论需要多长时间)调用您的任务。另请注意,它可以处理您的任务执行超过一小时的情况(设计或意外)。您可以选择并行启动第二个任务,或跳过后续调用。

我通常会使用执行器框架。它提供了许多有用的功能,您可以封装您的任务,这样它们就不必预定的执行程序中运行,而是在任何执行程序中运行。

于 2013-08-21T09:53:05.507 回答
1

对于这种情况,普通线程与执行服务是错误的二分法。真正的问题应该是,使用旧Timer的还是新的ScheduledExecutorService。即使在 Java 1.2 上,尝试使用普通线程重新实现任务调度也是完全多余的。

答案将再次是“使用执行器服务”。它更方便、更灵活和可扩展。随着应用程序的增长,使其适应越来越苛刻的要求几乎是微不足道的。

计时器 == 旧计时器

真的,在今天的 Java 中,线程与计时器与 ExecutorService 的整个问题都应该被删除为已弃用。使用 ExecutorService 不会出错;使用任何其他选项,你就会把自己画到一个角落里。

于 2013-08-21T09:57:13.933 回答
0

我认为这取决于你需要什么。

ScheduleExecutorService 有一些有用的功能,例如

scheduleAtFixedRate:无论您的任务运行多长时间,此调用都将确保您的任务以固定速率运行。例如,心跳

scheduleWithFixedDelay:这个会在你的任务完成后增加一个延迟,例如,一些干净的工作。

于 2013-08-21T09:54:10.920 回答
0

ScheduledExecutorService 应该是一个不错的选择,因为您不需要编写代码来定期安排任务。使用经过良好测试的框架比编写自己的框架要好。您可以依靠 ScheduledExecutorService 定期执行配置的任务。它将节省您编写类似功能的时间和精力。

使用 ScheduledExecutorService 的其他好处是您可以取消任务,可以在任务完成后获取任务状态等。

于 2013-08-21T09:57:07.353 回答
0

ScheduleExecutorService 为您提供了一种通过返回 ScheduledFuture 来检查/取消执行的方法。如果您使用单线程,则必须自己实现。

于 2013-08-21T09:57:16.947 回答