handler.postDelayed vs ScheduledThreadPoolExecutor.scheduleWithFixedDelay

时间:2018-03-21 13:00:16

标签: android multithreading handler scheduledexecutorservice

我应该如何选择new ScheduledThreadPoolExecutor(1).scheduleWithFixedDelayHandler.postDelayed()

它们一样吗?它们之间有什么区别?

Future scheduledFuture = scheduledExecutor.scheduleWithFixedDelay(runnable, 0, delay, TimeUnit.MILLISECONDS);
new Handler().postDelayed(runnable, delay);

2 个答案:

答案 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

  

scheduleWithFixedDelay 创建并执行一个周期性操作,该操作在给定的初始延迟后首先启用,然后在一次执行终止和下一次执行开始之间给定延迟。如果任务的任何执行遇到异常,则后续执行被禁止。否则,任务将仅通过取消或终止遗嘱执行人而终止。

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                        long initialDelay,
                                        long delay,
                                        TimeUnit unit)

使用Timer

有一些缺点
  • 它只创建一个线程来执行任务,如果任务运行时间太长,其他任务就会受到影响。

  • 它不处理由任务抛出的异常,并且线程只是终止,这会影响其他计划任务并且它们永远不会运行

Handler

  

Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。每个Handler实例都与一个线程和该线程的消息队列相关联。当您创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在消息出来时执行它们队列中。

Handler 专为

而设计
  1. 安排消息和runnables作为未来的某个点执行;和

  2. 将要在不同于自己的线程上执行的操作排入队列。