Android性能优化之线程优化

2020-04-19  本文已影响0人  怪兽来啦啦啦啦啦

前言

 线程在使用过程中,往往会遇见直接new Thread()的操作,这样做除了方便外,坏处也有很多,例如线程无法复用、线程数无法控制导致CPU频繁切换降低性能等问题。我们应当在项目早期就有意识的使用线程池收敛线程,降低后期的工作量。


1 线程调度

1.1 线程调度原理

1.2 线程调度模型

1.3 Android线程调度

 android为线程调度分别提供了设置nice值、cgroup两种方法。

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)

-注意点
①线程过多会导致CPU频繁切换,降低线程运行效率。
②任务量大的线程应为较低优先级,避免产生①问题
③优先级具有继承性


2 Android异步

 除了可以使用线程池外,Android还为我们提供了三种异步方法:HandlerThread、IntentService、AsyncTask。

2.1 Thread

 最简单粗暴的方式,不建议直接使用,因为存在以下几点问题:
①不易复用,频繁创建及销毁开销大
②复杂场景不易使用,例如定时任务

2.2 HandlerThread

2.3 IntentService

2.4 AsyncTask

2.5 线程池

2.6 RxJava


3 Android线程优化

3.1 使用准则

3.2 线程池工具类

 项目走向成熟期之后需要对线程进行收敛,避免线程随意创建,如果集成的框架能主动设置线程池,我们应当设置成自己的线程池,对线程创建及使用情况进行监控。

public class ThreadPoolUtils {
    private final Executor mDiskExecutor;

    private final Executor mNetworkExecutor;

    private final Executor mMainThread;
    private final ScheduledThreadPoolExecutor schedule;
    //cpu密集型任务最大线程数
    private int CPU_Runtime = Runtime.getRuntime().availableProcessors() + 1;
    //io密集型任务最大线程数
    private int IO_Runtime = Runtime.getRuntime().availableProcessors() * 2 + 1;

    private static ThreadPoolUtils instance;

    private static final Object object = new Object();

    public static ThreadPoolUtils getInstance() {
        if (instance == null) {
            synchronized (object) {
                if (instance == null) {
                    instance = new ThreadPoolUtils();
                }
            }
        }
        return instance;
    }

    private ThreadPoolUtils() {

        this.mDiskExecutor = Executors.newFixedThreadPool(CPU_Runtime, new MyThreadFactory("MonsterDE"));

        this.mNetworkExecutor = Executors.newFixedThreadPool(IO_Runtime, new MyThreadFactory("MonsterNE"));

        this.mMainThread = new MainThreadExecutor();

        this.schedule = new ScheduledThreadPoolExecutor(IO_Runtime, new MyThreadFactory("MonsterSC"),
                new ThreadPoolExecutor.AbortPolicy());
    }

     /**
     * 记录是线程池中第几个线程
     */
    private static class MyThreadFactory implements ThreadFactory {

        private final String name;
        private final AtomicInteger mCount = new AtomicInteger(1);

        MyThreadFactory(String name) {
            this.name = name;
        }

        @Override
        public Thread newThread(@NonNull Runnable r) {
            return new Thread(r, name + "-" + mCount.getAndIncrement() + "-");
        }
    }

    public Executor diskIO() {
        return mDiskExecutor;
    }

    public ScheduledThreadPoolExecutor schedule() {
        return schedule;
    }

    public Executor networkIO() {
        return mNetworkExecutor;
    }

    public Executor mainThread() {
        return mMainThread;
    }

    private static class MainThreadExecutor implements Executor {
        private Handler mainThreadHandler = new Handler(Looper.getMainLooper());

        @Override
        public void execute(@NonNull Runnable command) {
            mainThreadHandler.post(command);
        }
    }
}


4 锁定线程


总结

 线程优化可以分为以下几点:

上一篇 下一篇

猜你喜欢

热点阅读