HandlerThread vs Executor – 什么时候比另一个更合适?

我只是好奇,是否有时间我应该select一个Executor通过HandlerThread 。 有人比其他人优越,还是应该坚持HandlerThread ? 在我的情况下,我目前正在侦听一个ServerSocket的连接, ServerSocket理由Executor创build一个单独的线程上的每个请求。 尽pipe我举了一个具体的例子,但我只是在寻找一个比另一个更合适的例子。 不过,我欢迎对我的devise提出意见。

Solutions Collecting From Web of "HandlerThread vs Executor – 什么时候比另一个更合适?"

Executor类更强大,可以使用线程池,而每个Handler引用单个线程。 Executor允许您获取所有计划的任务,并根据需要取消它们。 另一方面,处理程序不会回答简单的问题,例如有多less任务正在等待,或给我提供所有等待任务的参考。 我相信处理程序更有限的一个原因是,Android允许您访问它用于UI的主要处理程序,如果您开始取消操作系统任务,您可能真的搞砸了操作系统。

一般来说,如果你需要一个线程池或大量的电源使用执行程序。 如果你只是需要一个很好的后台线程一次运行一个任务使用处理程序。 作为一个例子,当我想查询我的数据库我只真的想要一个查询一次发生,我不想生成一个ANR,所以我使用后台线程上运行的处理程序来运行我的查询。

我相信你select的执行者听起来很合适,因为你想同时处理多个传入的请求,而Handler一次只能执行一个。

更新:如何创build一个后台线程上运行的处理程序:

在你的构造函数或者onCreate中写下如下内容,显然你可以将优先级设置为任何你喜欢的:

 public class MyClass { private Handler mBgHandler; public MyClass() { HandlerThread bgThread = new HandlerThread("My-Background-Handler"); bgThread.start(); mBgHandler = new Handler(bgThread.getLooper()); } } 

更新:当你完成它时,不要忘记退出()或退出你的HandlerThread,否则它将永远等待

截至2011年12月22日,我不会遵循satur9nine的答案中的示例代码。

Thread.MIN_PRIOROTY被映射到android.os.Process.THREAD_PRIORITY_LOWEST。 引用 :

线程优先级最低。 只有那些真的,真的不希望如果有其他事情正在发生。

我至less会使用android.os.Process.THREAD_PRIORITY_BACKGROUND,如下所示:

 HandlerThread bgThread = new HandlerThread("handler name"); Process.setThreadPriority(bgThread.getThreadId(), Process.THREAD_PRIORITY_BACKGROUND); bgThread.start(); mBgHandler = new Handler(bgThread.getLooper()); 

这将默认的Android后台优先级分配给线程。

目前,Process.THREAD_PRIORITY_BACKGROUND和优先级较低的线程通过Linux cgroup共享一个人为限制的CPU时间,例如在这里可以看到。 如果一个后台任务不只是等待I / O,而是执行真正的计算,我会考虑通过android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE来提高它的优先级,它(当前)将它移出背景cgroup,同时不会实质上危害UI。实时活动。

更新: Satur9nine的答案在2013年1月 – 2008年1月份被无声地修改,以便不再设置可能的最低优先级。 HandlerThread现在隐式地具有android.os.Process.THREAD_PRIORITY_BACKGROUND的优先级。 这意味着它现在获得了默认的后台任务的优先级,但是它仍然限制在可能存在的所有其他后台任务中消耗最多10%的CPU时间。 如果不需要,请使用上面的代码,例如

 Process.setThreadPriority(bgThread.getThreadId(), Process.THREAD_PRIORITY_BACKGROUND + Process.THREAD_PRIORITY_MORE_FAVORABLE); 

把你的后台线程从cgroup中解脱出来。