Java并发编程(六)——调度

摘要:
具体过程如下:1.3 Java线程调度的实现:抢占式Java使用抢占式调度实现内部线程调度。Java将根据每个线程的优先级为其分配不同的CPU时间片,优先级较高的线程将首先执行。Java的线程调度将在确保效率的同时尽量确保公平性。当前线程已完成运行。

1、线程调度

1.1 抢占式调度

  抢占式调度是指每个线程都以抢占的方式获取CPU资源并快速执行,在执行完毕后立即释放CPU资源。在抢占式调度模式下,每个线程对CPU资源的申请地位是相等的,一个线程堵塞不会导致整个进程性能下降,具体流程如图:

Java并发编程(六)——调度第1张

1.2 协同式调度

  协同式调度是指某个线程在执行完毕后主动通知操作系统将CPU资源切换到另一个线程上执行。

  协同式调度的缺点是如果其中一个线程因为外部原因运行阻塞,会导致整个系统阻塞甚至崩溃。

  具体流程如图:

Java并发编程(六)——调度第2张

1.3 Java线程调度的实现:抢占式

  Java采用抢占式调度的方式实现内部的线程调度。Java会为每个线程按照优先级高低分配不同的CPU时间片,优先级高的线程优先执行。Java的线程调度在保证效率的前提下会尽量保证公平性。

1.4 线程让出CPU情况

  • 当前线程主动放弃CPU,如线程调用了yield()放弃CPU的使用权。
  • 当前运行的线程进入阻塞状态,如调用文件读取I/O操作、锁等待、Socket等待。
  • 当前线程运行结束。

2、进程调度算法

  进程调度算法包括优先调度算法、高优先权优先调度算法和基于时间片的调度算法。

2.1 优先调度算法

  优先调度算法包含先来先服务调度算法和短作业优先调度算法。

  1.先来先服务调度算法

  先来先服务调度算法在获取到可用的CPU资源时会从就绪队列中选择一个最早进入队列的进程,为其分配CPU资源并运行。

  2.短作业优先调度算法

  短作业优先调度算法在获取到可用的CPU资源时会从就绪队列中选择一个预估运行时间最短的进程,为其分配CPU资源并运行。

2.2 高优先权优先调度算法

  高优先权优先调度算法在定义任务的时候为每个任务都设置不同的优先权,在进行任务调度时优先权最高的任务首先被调度。

  1.非抢占式优先调度算法

  非抢占式优先调度算法在获取到可用的CPU资源时会从就绪队列中选出一个优先权最高的进程,为其分配CPU资源并运行。进程在运行过程中一直持有该CPU,直到进程执行完毕或发生异常而放弃该CPU。

  2.抢占式优先调度算法

  抢占式优先调度算法首先把CPU资源分配给优先权最高的任务并运行,但如果在运行过程中出现比当前任务优先权更高的任务,就会暂停运行该任务并回收CPU资源,新的优先权更高的的任务会获取CPU资源。

  3.高响应比优先调度算法

  高响应比优先调度算法使用了动态优先权的概念,即任务的优先权越短,其优先权越高,任务的等待时间越长,优先权越高。

  优先权变化规律如下:

  • 在作业的等待时间相同时,运行时间越短,优先权越高。
  • 在作业的运行时间相同时,等待时间越长,优先权越高。
  • 作业的优先权随作业的等待时间的增加而不断提高。

2.3 时间片的轮转调度算法

  时间片的轮转调度算法将CPU资源分成不同的时间片,不同的时间片为不同的任务服务,包括时间片轮转法和多级反馈队列调度算法。

  1.时间片轮转法

  队列中的任务轮流获取一定的CPU时间片去运行。

  2.多级反馈队列调度算法

  多级反馈队列调度算法在时间片轮转算法的基础上设置多个就绪队列,并为每个就绪队列,并为每个就绪队列都设置不同的优先权。队列的优先权越高,队列中的任务被分配的时间片就越大。默认第一个队列优先权最高,其他次之。

免责声明:文章转载自《Java并发编程(六)——调度》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Lua常用时间函数APScheduler定时任务框架下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL锁定状态查看命令

1 show processlist; SHOW PROCESSLIST显示哪些线程正在运行。您也可以使用mysqladmin processlist语句得到此信息。如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账户相关的线程)。如果有线程在update或者insert 某个表,此时进程的stat...

JVM+微服务+多线程+锁+高并发性能

JVM+微服务+多线程+锁+高并发性能 方志朋  1.Redis 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、...

jdk线程的简单使用

一、线程的实现方式方式一:继承Thread类一个类只要继承了Thread类,并重写run()方法,则就可以实现多线程的操作。 public class ThreadDemo01 { public static void main(String[] args) { Thread1 thread1 = new Thread1("thr...

java中终止线程的三种方式

在java中有三种方式可以终止线程。分别为:   1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。      2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。        3.  使用interrupt方法中断线程。 下面我们来详细的介绍这三种方...

C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)

本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而对每种方式的使用细节,适用场合不会过多解释。 让我们来看看这几个类的关系图: 1. lock 关键字 lock 是 C# 关键词,它将语句块标记为临界区,...

JVM基本讲解

 1.数据类型     java虚拟机中,数据类型可以分为两类:基本类型和引用类型。     基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值。     “引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。     基本类型包括:byte、short、int、long、char、flo...