Java 多线程的调度算法

1、多线程常见的调度算法

1.1、先到先执行的调度算法

先到先执行的调度算法,虽然原理简单但是容易造成“线程饿死”的后果。如果当前占用CPU的线程执行的时间过长,那么后面的线程根本没有机会执行了,导致“线程饿死”。

1.2、优先级抢占式的调度算法

为了避免出现“线程饿死”,人们提出了优先级抢占式的调度算法,谁的优先级高,谁先执行,即便对方已然在CPU中运行,也会被优先级高的线程所打断。但是,理想美好而现实很骨感,优先级抢占式的做法只能让整个线程世界更乱套,犹如战国时期,战火不断,政权迭代,一片混乱。

1.3、时间片轮转的调度算法

时间片轮转的调度算法,非常公平,让每个线程都有机会得到执行,有效的解决了“线程饿死”的问题。世界不是绝对的,任何方法都非十全十美,但是时间片轮转是最解决完美的线程调度方案。

2、Java内部的调度算法

Java内部的调度算法融合了以上三种调度算法:
(1)当两个线程的优先级相同的时候,执行先到先执行的调度算法。
(2)当出现优先级高的线程,采用优先级抢占式的调度算法,它会抢夺正在CPU运行的优先级的线程。当然,它也不会一直执行下去,否则会导致其他线程的饿死,而是执行一段时间就让出CPU供其他线程运行,这个之后采用的是时间片轮转的调度算法。

3、本文小结

虽然Java多线程融合了三种调度算法,看似复杂,但是实际上起到关键作用的还是时间片轮转的调度算法。所以,建议大家在学习的过程中,直接认为“Java采用时间片轮转的调度算法”,这样简单直接,而且注意力更集中,遇到问题不至于乱了阵脚。

4、参考

https://www.javatpoint.com/thread-scheduler-in-java