我应该如何选择new ScheduledThreadPoolExecutor(1).scheduleWithFixedDelay
或Handler.postDelayed()
?
它们一样吗?它们之间有什么区别?
Future scheduledFuture = scheduledExecutor.scheduleWithFixedDelay(runnable, 0, delay, TimeUnit.MILLISECONDS);
new Handler().postDelayed(runnable, delay);
答案 0 :(得分:1)
ScheduledExecutorService是一种非常通用的线程管理解决方案。您使用特定数字将其初始化为工作线程,然后为其提供工作单元。您可以延迟/时间和重复工作单位。
Handler是一个用于在线程之间进行通信的类。处理程序在Thread上运行,你已经传递给它的Looper。如果您的Handler在MainThread中实例化,那么它在MainThread上运行,如果您使用Looper(HandlerThread)创建一个Worker Thread并将它的Looper传递给Handler,那么它将在该工作线程上运行。
基本上他们两个都在延迟后执行任务,但请注意
scheduledExecutor.scheduleWithFixedDelay
将始终执行 工作线程,如Handler.postDelayed
将在Thread上运行 它附加到的位置(MainThread或BackGround线程)
答案 1 :(得分:1)
Handler
- 在可选延迟后在UIThread上执行Runnable任务
ScheduledThreadPoolExecutor
- 使用后台线程池执行定期任务
scheduleWithFixedDelay
创建并执行一个周期性操作,该操作在给定的初始延迟后首先启用,然后在一次执行终止和下一次执行开始之间给定延迟。如果任务的任何执行遇到异常,则后续执行被禁止。否则,任务将仅通过取消或终止遗嘱执行人而终止。
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit)
使用Timer
有一些缺点它只创建一个线程来执行任务,如果任务运行时间太长,其他任务就会受到影响。
它不处理由任务抛出的异常,并且线程只是终止,这会影响其他计划任务并且它们永远不会运行
Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。每个Handler实例都与一个线程和该线程的消息队列相关联。当您创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在消息出来时执行它们队列中。
Handler
专为
安排消息和runnables作为未来的某个点执行;和
将要在不同于自己的线程上执行的操作排入队列。