Android线程调度机制

[译]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。

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

关于框架有意见 欢迎联系我一起探讨。 问答是happy http://blog.csdn.net/b275518834/article/details/8247685 操作方式:输入文本框设置线程数 点击第一个按钮请求10个地址信息 点击第二个按钮中断10个地址信息 1:判断当前网络环境 2:编写了3套方案 Old_GridViewActivity 简单线程回调 AsyncTask_GridViewActivity 使用android自带的AsyncTask类实现 Demo_GridViewActivity 队列任务管理 线程控制 Demo_GridViewActivity方式 1:队列优先级 (如果想要listview中移动的区域优先被显示,而不是从上到下显示图片,可以把新建的任务提到任务队列前端) 2:实现了:中断任务的功能(比如进入一个Activity会开启大量任务,如果退出这个Activity 则应该停止此Activity中驻留的任务) 3:为何采用drawable不用bitmap bitmap优点是位图运算效率优秀 但drawable的存储体积比bitmap小 4:如果任务被起名字则禁止重复提交任务 (避免某些请求未处理完又被创建) 5:先执行缓存数据后执行请求数据 (缓存性能) 6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 (旧的系统症结所在) 开启过多线程,导致系统频繁切换多个线程,导致处理速度过慢,经常出现未响应。 代码经常写的换繁多无序,维护困难。 使用类似银行叫号系统 线程池内等待网络请求的任务=(排队的人) 最大三个线程=(银行柜台处理业务的窗口) 依次处理任务=(将排队的人依次被叫到处理的号,完成业务的窗口叫号后面排队的人) 如果抛出异常则通知相关单位=(如果银行柜台处理不了一个人的业务就打电话给大堂经理) 设置柜台的监听回调=(A委托B去银行请求数据,当B去银行处理业务失败了,通知A。) 设置撤销机制线程安全= 某机关让A和B去银行申请业务,A在排队,B正在柜台处理业务,此时机关打来电话说, 这申请业务的需求现在不做,A取消排队,B也‘礼貌的退出’ 《例如退出A页面时,终止A页面所有的请求》 任务状态标示-还没处理 处理中 处理结束 处理异常 (有结果但不通知)=(排队人的状态) 任务名 排队人的名字 强制退出 强制退出 抛出强制退出的异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值