JVM线程调度机制

概念

针对单核CPU的计算机,为了使用多个线程并发执行任务,需要采用线程调度机制去分配线程的CPU使用权,未被CPU分配使用权的线程将在线程池等待线程调度分配资源运行

调度模型

分时调度模型

指让所有的线程轮流获得 cpu 的使用权,并且平均分配每个线程占用的 CPU 的时间片

抢占式调度模型

指优先让可运行池中优先级高的线程占用 CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用 CPU

Java 的线程调度

java虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU

特征 :

  1. JVM使用基于优先级的抢占式调度算法进行调度
  2. 所有Java线程都有一个优先级,并且优先级最高的线程被调度为由JVM运行
  3. 如果两个线程具有相同的优先级,则遵循FIFO顺序

如果发生以下事件之一,则会调用一个不同的线程来运行:

1.当前正在运行的线程退出Runnable状态,即阻塞或终止。

2.具有比当前正在运行的线程更高的优先级的线程进入Runnable状态。优先级较低的线程被抢占,而优先级较高的线程被计划运行。

线程可以通过yield()方法自愿进行让出使用权。只要有一个线程对CPU进行控制,就计划运行另一个具有相同优先级的线程。自愿放弃对CPU的控制的线程称为协作多任务

线程优先级

JVM选择以最高优先级运行可运行线程。

所有Java线程的优先级都在1-10之间。

最高优先级为10,最低优先级为1。

优先权即 默认情况下,优先级为5。

Thread.MIN_PRIORITY-最小线程优先级

Thread.MAX_PRIORITY-最大线程优先级

Thread.NORM_PRIORITY-最大线程优先级

每当创建新的Java线程时,它就具有与创建它的线程相同的优先级。

线程优先级可以通过setpriority()方法进行更改。

让出使用权

通过使用代码可以让出线程的CPU使用权,有以下办法:

  • 调整各个线程的优先级
  • 让处于运行状态的线程调用 Thread.sleep() 方法
  • 让处于运行状态的线程调用 Thread.yield() 方法
  • 让处于运行状态的线程调用另一个线程的 join() 方法
 线程通信方式
Java线程生命周期和运行流程中的状态切换 
上一篇:线程通信方式
下一篇:Java线程生命周期和运行流程中的状态切换
评论

如果我的文章对你有帮助,或许可以打赏一下呀!

支付宝
微信
QQ