大家好,我是神韵,是一个技术&生活博主。关于文章都是定位为基础,我不敢讲的太深入,因为我怕自己没时间。欢迎来点赞打卡,你们的行动将是我无限的动力。
今日主题是:线程的调度之协同式和抢占式

话不多说,下面进入今天主题
  线程调度是指系统为线程分配处理器(CPU)使用权的过程。通俗点就是线程需要得到CPU的使用权才可以进行工作,而CPU使用权是系统给线程分配的,系统分配CPU使用权给相应线程这个过程就是线程调度。其调度方式主要分为两种:

  1. 协同式线程调度 Cooperative Threads-Scheduling
  2. 抢占式线程调度 Preemptive Threads-Scheduling

1、协同式线程调度
协同就是指线程的执行时间由线程本身来控制,线程把自己的工作执行完之后,要主动通知系统切换到另一个线程上。

  • 优点:实现简单,线程干完事情才切换线程,没有上下文切换操作,省CPU资源。
  • 缺点:易阻塞,一直占有CPU阻塞不让出使用权,可能会导致整个系统崩溃。

2、抢占式线程调度
  线程的切换不由线程本身决定,是系统控制的。也就是说线程本身是没有办法主动获得可控的执行时间的,但是可以让出执行时间,比如Java中的Thread.yield()。Java线程调度属于抢占式线程调度。

  • 优点:不易阻塞
  • 缺点:因为线程切换由系统控制,线程上下文切换会比较频繁,消耗比较多的CPU资源。

  Java线程调度是可抢占式的,但是Java还提供了优先级10个级别,可以让高优先级的线程容易获取CPU使用权,从而总体来说执行时间会多。
  但是这个优先级不是那么靠谱,因为通过JC01文章可知,Java线程是用户线程加轻量级进程混合实现,并且用户线程:轻量级进程:内核线程=1:1:1的关系,那么Java线程的优先级就要映射到内核线程,从而遵循内核线程的优先级别才能使得Java线程优先级别生效。但是内核线程是7个级别,Java是10个,所以就有了一定不可靠性,下面是它们的对应关系:

java 抢占模式 抢占式线程_java 抢占模式


本文结束!