JVM线程调度机制
概念
针对单核CPU的计算机,为了使用多个线程并发执行任务,需要采用线程调度机制去分配线程的CPU使用权,未被CPU分配使用权的线程将在线程池等待线程调度分配资源运行
调度模型
分时调度模型
指让所有的线程轮流获得 cpu 的使用权,并且平均分配每个线程占用的 CPU 的时间片
抢占式调度模型
指优先让可运行池中优先级高的线程占用 CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用 CPU
Java 的线程调度
java虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU
特征 :
- JVM使用基于优先级的抢占式调度算法进行调度
- 所有Java线程都有一个优先级,并且优先级最高的线程被调度为由JVM运行
- 如果两个线程具有相同的优先级,则遵循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()
方法
上一篇:线程通信方式
仅有一条评论
Thread.NORM_PRIORITY-最大线程优先级 --写错啦
Reply