线程调度原理
在任意时刻,只有一个线程占用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利用率并不高,这个时候适合使用多线程