Java中的线程调度器

Java中负责决定哪个线程运行或执行,以及哪个线程等待的组件称为线程调度器。在Java中,只有当线程处于可运行状态时,线程调度器才会选择它。然而,如果有多个线程处于可运行状态,线程调度器会选择其中一个线程并忽略其他线程。有一些标准决定哪个线程将首先执行。线程调度有两个因素:优先级和到达时间。

优先级:每个线程的优先级介于1到10之间。如果线程具有较高的优先级,意味着该线程更有机会被线程调度器选中。

到达时间:假设有两个具有相同优先级的线程进入可运行状态,那么优先级不能成为选取这两个线程的因素。在这种情况下,线程调度器将考虑线程的到达时间。先到达的线程优先于其他线程。

线程调度算法

根据上述因素,Java线程调度器遵循调度算法。

先来先服务调度:

在此调度算法中,调度器选择最先到达可运行队列的线程。观察下表:

线程到达时间
t10
t21
t32
t43

在上表中,我们可以看到Thread t1最先到达,然后是Thread t2,然后是t3,最后是t4,线程的处理顺序根据线程的到达时间确定。

图1

因此,Thread t1将首先被处理,Thread t4将最后被处理。

时间片轮转调度:

通常,先来先服务算法是非抢占式的,这是不好的,因为它可能导致无限阻塞(也称为饥饿)。为了避免这种情况,给线程提供了一些时间片,这样经过一段时间后,运行中的线程必须释放CPU。这样,其他等待的线程也有机会运行它们的任务。

图2

在上图中,每个线程被分配2秒的时间片。因此,2秒后,第一个线程释放CPU,然后CPU被Thread2占用。其他线程也是同样的过程。

抢占式优先级调度:

调度算法的名称表示与线程的优先级有关。

图3

假设有多个线程处于可运行状态。线程调度器选择具有最高优先级的线程。由于该算法是抢占式的,因此也为线程提供时间片以避免饥饿。因此,经过一段时间,即使最高优先级的线程尚未完成其任务,也必须由于抢占而释放CPU。

Java线程调度器的工作原理

图4

让我们理解Java线程调度器的工作原理。假设有五个具有不同到达时间和不同优先级的线程。现在,线程调度器有责任决定哪个线程将首先获得CPU。

线程调度器选择具有最高优先级的线程,该线程开始执行作业。如果一个线程已经处于可运行状态,并且另一个具有较高优先级的线程到达可运行状态,则当前线程将从处理器中抢占,并且具有较高优先级的到达线程获得CPU时间。

当具有相同优先级和到达时间的两个线程(Thread 2和Thread 3)时,调度将根据FCFS算法决定。因此,先到达的线程有机会首先执行。

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想