性能优化之 线程优化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/coderinchina/article/details/96063134

线程调度原理

在任意时刻,只有一个线程占用cpu,处于运行状态,在多线程并发的情况下,轮流使用CPU的使用权,但是现在是多核的时代, 比如现在很多电脑或者手机是8核的,意思是有8个cpu,让这8个cpu去执行任务,如果是执行任务很多的情况下,cpu是轮流的方式去执行任务的,而这个CPU去执行任务是由cpu去负责调度的,

线程调度模型

线程调度模型有二类

 第一类:分时调度

第二类: 抢占式调度

在Java中是使用第二种方式

Android线程调度

也是分成二部分

第一:nice值,是在Process类中定义的 它的值越小 优化及越高

 /**
     * Default scheduling policy
     * @hide
     */
    public static final int SCHED_OTHER = 0;

这是Android中默认的优化线看看Android中默认的优先级有哪些:

第二:cgroup 

更严格的群组调度策略,保证前台线程更多的获取cpu使用权

注意点

线程过多会导致CPU切换频繁,降低线程运行效率,

线程优先级具有继承性 , 比如我A线程优先级是5 B线程继承了A,如果没有设置优先级的话 那么B线程的优先级也是5

android 异步方式

1:new Thread的方式来创建线程,这个方式简单 但是在具体的项目不适合,因为这种方式创建线程不具备服用,而且线程的创建和销毁都是消耗资源,创建消耗内存资源

2:HandlerThread 自带消息循环的,它是串行执行,比较适合长时间执行,不断的从队列中获取任务

3:IntentService  它是继承了Service类 内部创建了HandlerThread,相对Service,IntentService是运行在异步线程,不占用主线程,不会阻塞UI线程的执行,还有它的优先级比Service高,不容易被系统Kill掉,

4:AsyncTask,这个基本用不到,但是里面的源码可以分析下,挺好的,在api14版本把之前的问题修复了

5:线程池,它的优点是线程能服用,减少了线程创建和销毁的时间,从而提高了效率,还有定时 队列优势,在网络框架和图片加载框架都会用到

6:Rxjava 中也提供了异步线程的操作

线程池合理配置线程数

这里指的配置线程数,是指线程池中的最大线程数,这个分情况, 看是IO密集型还是cpu密集型,比如网络网络请求
cpu密集型:cpu核数+1

io密集型:cpu核数*2+1

cpu的核数通过

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

获取,看下AsyncTask源码就知道了,

CPU密集型

CPU密集型会消耗掉大量的CPU资源,例如需要大量的计算,视频渲染啊,仿真啊之类的。这个时候CPU就卯足了劲在运行,这个时候切换线程,反而浪费了切换的时间,效率不高。

就像你的大脑是CPU,你本来就在一本心思地写作业,多线程这时候就是要你写会作业,然后立刻敲一会代码,然后在P个图,然后在看个视频,然后再切换回作业。emmmm,过程中你还需要切换(收起来作业,拿出电脑,打开VS…)那你的作业怕是要写到挂科。。。这个时候不太适合使用多线程,你就该一门心思地写作业~

IO密集型

涉及到网络、磁盘IO的都是IO密集型,这个时候CPU利用率并不高,这个时候适合使用多线程

猜你喜欢

转载自blog.csdn.net/coderinchina/article/details/96063134