您的位置:首页 > 移动开发 > Android开发

Android线程调度机制

2015-07-30 15:06 423 查看



[译]Android线程调度机制

2014-2-24阅读789 评论0

在Android Weekly上看到了一篇关于Android线程调度的文章,感觉挺不错的,试着将其翻译了一下,

原文地址http://www.androiddesignpatterns.com/2014/01/thread-scheduling-in-android.html。

这篇文章是关于Android中线程是如何调度的,以及怎么样显示设置线程优先级保证应用程序在

多个线程在后台运行时保持响应。
线程调度是指操作系统负责决定哪些线程应该运行,以及什么时候,运行多长时间。
Android的线程调度使用两个主要因素来决定如何在整个系统调度线程:nice values和cgroups。

[b]Nice values


类似于在Linux的完全公平调度策略中使用,在Android中nice values被用在线程优先级上。

高nice values(低优先级)的线程运行次数少于低nice values(高优先级)的线程。

最重要的两个优先级是default和background。简单来说,线程优先级应该和该线程期望完成的工作量相反。

线程做的工作越多,它的优先级应该越小,以便它不会饿死系统。

所以,UI线程(Activity的主线程)通常是default优先级,

然而后台线程(AsyncTask的线程)通常是background优先级。
Nice values在理论上是重要的,因为他们减少了后台工作线程中断UI的可能性。
在实践中,但是,只有它们并不足够。例如,假设存在20个后台线程和一个单独的执行UI的前台线程。
虽然他们每个的优先级很低,但是合起来20个后台线程将影响前台线程的性能,结果损害了用户体验.
因为在任何时刻几个应用程序可能已经有等待运行的后台线程,Android OS必须以某种方式处理这些问题。

Cgroups

为了处理这个问题,Android系统使用Linux cgroups强制执行更严格的foreground、background调度策略。
background优先级的线程被隐式的移动到了background cgroup,它们被限制只有很小的几率利用CPU
如果在其它组中的线城是忙的。这种分离允许后台线程执行一些任务,而不会对用户可见的前台线程
产生较大的影响。
除了自动将低优先级线程分配给background cgroup,Android也将当前不在前台运行的应用程序的

线程移动到background cgroup中。将应用程序线程自动分组保证了当前前台线程总是优先的,

无论在后台运行的应用程序有多少。

设置线程优先级:Process.setThreadPriority(int)

大多数情况下,Android APIs已经为工作线程分配了background优先级(例如,HandlerThead
和AsyncTask)。在主UI线程中,实例化的Threads和ExecutorServices会继承default、
foreground优先级,可能会影响或损害应用的性能。在这些情况中,你应该记得在线程运行
之前设置线程的优先级。这样做很简单,如下面的示例所示:
<div>new Thread(new Runnable() {</div>  		@Override
<div>    	Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);</div>  		public void run() {

// ...
<div>	}).start();</div><div>  		}</div>
由于Android是基于Linux内核的,所以要想深入Android的线程调度机制,还需要去学习

Linux的相关知识。http://m.blog.csdn.net/blog/tianzhihen_star/19825345

[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: