android开发过程中,线程优先级存在两种设置方法,一是Java的设置方法,二是android提供的设置方法。
一、Java线程优先级设置方法
Thread thread1 = new Thread();
thread1.setPriority(10);
内部调用的也是底层的方法
public final void setPriority(int newPriority) {
ThreadGroup g;
checkAccess();
if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
// Android-changed: Improve exception message when the new priority is out of bounds.
throw new IllegalArgumentException("Priority out of range: " + newPriority);
}
if((g = getThreadGroup()) != null) {
if (newPriority > g.getMaxPriority()) {
newPriority = g.getMaxPriority();
}
// Android-changed: Avoid native call if Thread is not yet started.
// setPriority0(priority = newPriority);
synchronized(this) {
this.priority = newPriority;
if (isAlive()) {
setPriority0(newPriority);
}
}
}
}
最后通过setPriority0调用底层的c方法,改变线程在系统中的优先级
private native void setPriority0(int newPriority);
二、Android线程优先级设置方法
Thread thread = new Thread(){
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
}
};
因为android.os.Process类设置优先级需要运行时的线程tid,所以一般设置都是在Thread的run方法内部获取。
当然也可以在run方法运行内部获取tid,然后在设置优先级
Thread thread = new Thread(){
@Override
public void run() {
tid[0] = Process.myTid();
}
};
Process.setThreadPriority(tid[0],Process.THREAD_PRIORITY_DEFAULT);
调用的直接就是底层方法,改变ART中虚拟机的线程优先级和调度策略,让优先级高的线程优先执行。
public static final native void setThreadPriority(int tid, int priority)
throws IllegalArgumentException, SecurityException;
说明:在四大组件的生命周期方法内部,不要使用android.os.Process.setThreadPriority()设置线程优先级低,这样会导致主线程启动很慢,因为四大组件的生命周期都是在主线程中的,太慢就会导致主线程启动慢,进而影响app的启动时间和用户体验。
三、对比
1、两种都是可以起到改变线程优先级的作用,最后都是通过底层的c方法改变线程的优先级;
2、Process设置的优先级范围更加大,更加适配Linux系统底层;
3、Process改变优先级的同时,还可以改变线程调度策略,功能更加强大。
所以android中更加推荐使用Process设置优先级。