使用执行器框架还是普通线程?

时间:2013-08-21 09:48:34

标签: java multithreading executors scheduledexecutorservice

最近我收到了一个面试问题:

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

我很困惑。

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

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

虽然有一个ScheduleExecutorService提供了很多方法来进行调度吗?

最好的方法是什么?

5 个答案:

答案 0 :(得分:6)

上述解决方案的问题在于,如果您的任务需要59分钟,那么您的线程将花费59分钟执行您的任务,然后睡眠一小时。所以你每隔(差不多)2小时就会调用一次你的任务。

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

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

答案 1 :(得分:1)

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

答案将是“使用Executor服务”。它更方便,更灵活,更具可扩展性。随着应用程序的增长,将其应用于更加困难的要求几乎是微不足道的。

Timer == Oldtimer

实际上,在今天的Java中,Thread vs. Timer与ExecutorService的整个问题应该被弃用。使用ExecutorService,你不会出错;使用任何其他选项,你就是把自己画成一个角落。

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

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

使用ScheduledExecutorService的其他好处是你可以取消任务,一旦完成就可以获得任务的状态等。

答案 4 :(得分:0)

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