Android线程介绍(一)—— Java线程优先级和Android线程优先级对比

本文探讨了在Android开发中设置线程优先级的两种方法,即Java线程优先级和Android的`android.os.Process`设置方法。通过分析两者在设置线程优先级和调度策略上的差异,指出在四大组件生命周期内不应使用`Process.setThreadPriority()`以避免影响主线程启动速度和用户体验。推荐在Android中使用`Process`来设置线程优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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设置优先级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值