最近我收到了一个面试问题:
有一种情况,一个线程在一小时的间隔内执行批处理操作,你会使用执行器框架或普通线程吗?为什么?
我很困惑。
由于只有一个线程,因此不需要执行程序服务。我可以使用while
来做
和sleep
。
while(1)
{
// do task
// t1.sleep(60*60*1000);
}
虽然有一个ScheduleExecutorService提供了很多方法来进行调度吗?
最好的方法是什么?
答案 0 :(得分:6)
上述解决方案的问题在于,如果您的任务需要59分钟,那么您的线程将花费59分钟执行您的任务,然后睡眠一小时。所以你每隔(差不多)2小时就会调用一次你的任务。
如果您使用预定的执行程序框架,那么这将在每小时 小时(无论需要多长时间)调用您的任务。另请注意,它可以处理任务执行超过一小时的情况(无论是设计还是偶然)。您可以选择并行启动第二个任务,或跳过后续调用。
我通常会使用执行程序框架。它提供了许多有用的功能,您可以封装您的任务,使得它们只不必在预定的执行程序中运行,而是在任何执行程序中运行。
答案 1 :(得分:1)
普通线程与执行者服务对于这种情况是错误的二分法。真正的问题应该是,使用旧Timer
与新ScheduledExecutorService
。即使在Java 1.2上,尝试使用普通线程重新实现任务调度也是完全多余的。
答案将是“使用Executor服务”。它更方便,更灵活,更具可扩展性。随着应用程序的增长,将其应用于更加困难的要求几乎是微不足道的。
实际上,在今天的Java中,Thread vs. Timer与ExecutorService的整个问题应该被弃用。使用ExecutorService,你不会出错;使用任何其他选项,你就是把自己画成一个角落。
答案 2 :(得分:0)
我认为这取决于你需要什么。
ScheduleExecutorService有一些有用的功能,例如
scheduleAtFixedRate:无论您的任务运行多长时间,此调用都将确保您的任务以固定速率运行。例如,心跳scheduleWithFixedDelay:这个将在你的任务完成后添加一个延迟,例如,一些干净的工作。
答案 3 :(得分:0)
ScheduledExecutorService应该是一个不错的选择,因为您不需要编写代码来定期安排tak。使用经过良好测试的框架比编写自己的框架更好。您可以依赖ScheduledExecutorService来定期执行任务。它将节省您编写类似功能的时间和精力。
使用ScheduledExecutorService的其他好处是你可以取消任务,一旦完成就可以获得任务的状态等。
答案 4 :(得分:0)
ScheduleExecutorService通过返回ScheduledFuture为您提供了一种chek / cancel执行的方法。如果您使用单个线程,则必须自己实现。