Android线程调度机制

在Android Weekly上看到了一篇关于Android线程调度的文章,感觉挺不错的,试着将其翻译了一下,原文地址http://www.androiddesignpatterns.com/2014/01/thread-scheduling-in-android.html。

这篇文章是关于Android中线程是如何调度的,以及怎么样显示设置线程优先级保证应用程序在多个线程在后台运行时保持响应。

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

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优先级,可能会影响或损害应用的性能。在这些情况中,你应该记得在线程运行之前设置线程的优先级。这样做很简单,如下面的示例所示:
new Thread(new Runnable() {
  		@Override
  		public void run() {
    	Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);


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

你可能感兴趣的:(Android)