当前位置:主页>科 研>学术交流>

剖析Android中进程与线程调度之nice(2)

  Android API

Android中的线程优先级别目前规定了如下,了解了进程优先级与nice值的关系,那么线程优先级与值之间的关系也就更加容易理解。

THREAD_PRIORITY_DEFAULT,默认的线程优先级,值为0。

THREAD_PRIORITY_LOWEST,最低的线程级别,值为19。

THREAD_PRIORITY_BACKGROUND 后台线程建议设置这个优先级,值为10。

THREAD_PRIORITY_FOREGROUND 用户正在交互的UI线程,代码中无法设置该优先级,系统会按照情况调整到该优先级,值为-2。

THREAD_PRIORITY_DISPLAY 也是与UI交互相关的优先级界别,但是要比THREAD_PRIORITY_FOREGROUND优先,代码中无法设置,由系统按照情况调整,值为-4。

THREAD_PRIORITY_URGENT_DISPLAY 显示线程的最高级别,用来处理绘制画面和检索输入事件,代码中无法设置成该优先级。值为-8。

THREAD_PRIORITY_AUDIO 声音线程的标准级别,代码中无法设置为该优先级,值为 -16。

THREAD_PRIORITY_URGENT_AUDIO 声音线程的最高级别,优先程度较THREAD_PRIORITY_AUDIO要高。代码中无法设置为该优先级。值为-19。

THREAD_PRIORITY_MORE_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微优先,值为-1。

THREAD_PRIORITY_LESS_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微落后一些,值为1。

使用Android API为线程设置优先级也很简单,只需要在线程执行时调用android.os.Process.setThreadPriority方法即可。这种在线程运行时进行修改优先级,效果类似renice。

new Thread () {

@Override

public void run() {

super.run();

android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

}

}.start();

  Java原生API

Java为Thread提供了三个级别的设置,

MAX_PRIORITY,相当于android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY,值为10。

MIN_PRIORITY,相当于android.os.Process.THREAD_PRIORITY_LOWEST,值为0。

NORM_PRIORITY,相当于android.os.Process.THREAD_PRIORITY_DEFAULT,值为5。

使用setPriority我们可以为某个线程设置优先级,使用getPriority可以获得某个线程的优先级。

在Android系统中,不建议使用Java原生的API,因为Android提供的API划分的级别更多,更适合在Android系统中进行设定细致的优先级。

  注意

Android API的线程优先级和Java原生API的优先级是相对独立的,比如使用 android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND) 后,使用Java原生API,Thread.getPriority()得到的值不会改变。如下面代码:

new Thread() {

@Override

public void run() {

super.run();

Log.i(LOGTAG, "Java Thread Priority Before=" + Thread.currentThread().getPriority());

Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);

Log.i(LOGTAG, "Java Thread Priority=" + Thread.currentThread().getPriority());

}

}.start();

  上述代码的运行日志为

I/MainActivity( 3679): Java Thread Priority Before=5 I/MainActivity( 3679): Java Thread Priority=5

由于上面的这一点缺陷,导致我们在分析ANR trace时需要注意,在下面的ANR日志信息中,prio=5中proi的值对应的Java原生API的线程优先级。而nice=-6中的nice表示的Android API版本的线程优先级。

"main" prio=5 tid=1 NATIVE

| group="main" sCount=1 dsCount=0 obj=0x41690f18 self=0x4167e650

| sysTid=1765 nice=-6 sched=0/0 cgrp=apps handle=1074196888

| state=S schedstat=( 0 0 0 ) utm=5764 stm=3654 core=2

#00 pc 00022624 /system/lib/libc.so (__futex_syscall3+8)

#01 pc 0000f054 /system/lib/libc.so (__pthread_cond_timedwait_relative+48)

#02 pc 0000f0b4 /system/lib/libc.so (__pthread_cond_timedwait+64)

  避免ANR

我在之前的文章说说Android中的ANR中提到使用WorkerThread处理耗时IO操作,同时将WorkerThread的优先级降低, 对于耗时IO操作,比如读取数据库,文件等,我们可以设置该workerThread优先级为THREAD_PRIORITY_BACKGROUND,以 此降低与主线程竞争的能力。

(责任编辑:安博涛)

分享到:

更多
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
  • 微笑/wx
  • 撇嘴/pz
  • 抓狂/zk
  • 流汗/lh
  • 大兵/db
  • 奋斗/fd
  • 疑问/yw
  • 晕/y
  • 偷笑/wx
  • 可爱/ka
  • 傲慢/am
  • 惊恐/jk
用户名: 验证码:点击我更换图片
资料下载专区
图文资讯

企业如何抵御弱云密码

企业如何抵御弱云密码

弱密码对于依靠云服务的企业来说是一种常见的威胁。专家Dejan Lukan总结了一些关于密...[详细]

确保欧洲数据中心免受网络安全攻击

确保欧洲数据中心免受网络安全攻击

鉴于现如今数据中心的相关设备正日渐成为网络黑客的攻击目标,欧洲的数据中心运营商们...[详细]

国内数据分析“七宗罪”

国内数据分析“七宗罪”

每一个做过调研的人,都会惊讶于中美两国在大数据分析理念和客户心态上的巨大差别。 ...[详细]

使用软件定义技术的理由

使用软件定义技术的理由

不论对于数据中心的哪个部分,软件定义的概念都在不断发展。到现在为止,大多数管理员...[详细]

建立变更管理系统 消除数据中心混乱

建立变更管理系统 消除数据中心混乱

IT企业正陷入数据中心配置变更管理的困境,通常他们的变更管理工具已经过时。 业务流...[详细]

返回首页 返回顶部