线程:JVM,你能公平点吗

409 阅读3分钟

       您是否有过这样的困惑?在项目中,对于一些异步加载的操作,我们很方便的采用new Thread的方式就可以解决同步加载导致的页面出现ANR,那么为什么我们还要采取线程池的方式来实现呢?很多大牛都建议我们使用线程池,那么这样做到底有什么好处呢? 

        相信通过下面的一个学习,您会大喊一声:以后我在也不用new Thread的方式来创建线程了,下面我们开始真正的线程学习之旅。

      想要学习线程,首先我们学习一下线程被系统是怎么分配工作的,下面我们学习一下线程的调度原理。

线程的调度原理(谁来调用)

首先我们看看下面这张图:

1、任何时刻,只有一个线程占用CPU,并且处于运行状态。

2、多线程并发:轮流获取CPU的使用权。

3、JVM这个人负责线程调度,按照特定的机制分配CPU的使用权。

          通过上面的图示,我们知道了JVM总工来调度CPU执行线程,那么他就是是采用了一个什么样的方式来指挥呢?

         我们想象一下生活中的JVM的角色。

种情况:JVM是一个总负责人,它很公平,它会将CPU的时间平分,然后分配给3个线程,3个线程很高兴。

种情况:JVM会根据每个线程给它的小费,来划分CPU的时间,小费给的多的,那么分配给CPU的时间比较长,小费比较少的,那么分配给CPU的时间比较少。

其中,程序中也是如此,下面,我们来学习线程调度模型(线程以什么样的方式被调用)。

线程调度模型(怎么调用)

1、分时调度模型:轮流获取、均分CPU时间

2、抢占式调度模型:优先级高的获取

注意:Java采用的是抢占式的调用模型。(Java这个世界不公平

那么Andoid这个世界中,到底采用了什么样的线程调度的规则呢?

Android世界线程调度规则

Android线程调度根据下面的2个值来决定:nice(颜值) + group(组:站队)

nice值(颜值)

  1. 取值范围:-10 - 19
  2. 值约下,优先级越高
  3. 默认是THREAD_ PRIORITY_DEFAULT , 0

cgroup(组,站队)

  1. 更严格的群组调度策略。

  2. 保证前台线程可以获得更多的CPU。

说明:

Android世界里面有前台线程后台线程两大阵营,前台线程会在前台的group中,后台线程会在后台的group中,如果线程后台线程中,那么他拥有的权限比较低,那么他就有很小的概率来运行CPU,这样就可以保证前台线程可以获得更多的CPU执行时间

类似于生活中的:当你在很好的队(淘宝 VS 当当网)中,那么你可以享受更好的资源,是一样的道理。