Java教程-Java中的线程调度器

Java中的线程调度器
Java中负责决定哪个线程运行或执行,以及哪个线程等待的组件称为线程调度器。在Java中,只有当线程处于可运行状态时,线程调度器才会选择它。然而,如果有多个线程处于可运行状态,线程调度器会选择其中一个线程并忽略其他线程。有一些标准决定哪个线程将首先执行。线程调度有两个因素:优先级和到达时间。
优先级:每个线程的优先级介于1到10之间。如果线程具有较高的优先级,意味着该线程更有机会被线程调度器选中。
到达时间:假设有两个具有相同优先级的线程进入可运行状态,那么优先级不能成为选取这两个线程的因素。在这种情况下,线程调度器将考虑线程的到达时间。先到达的线程优先于其他线程。
线程调度算法
根据上述因素,Java线程调度器遵循调度算法。
先来先服务调度:
在此调度算法中,调度器选择最先到达可运行队列的线程。观察下表:
线程 | 到达时间 |
---|---|
t1 | 0 |
t2 | 1 |
t3 | 2 |
t4 | 3 |
在上表中,我们可以看到Thread t1最先到达,然后是Thread t2,然后是t3,最后是t4,线程的处理顺序根据线程的到达时间确定。
因此,Thread t1将首先被处理,Thread t4将最后被处理。
时间片轮转调度:
通常,先来先服务算法是非抢占式的,这是不好的,因为它可能导致无限阻塞(也称为饥饿)。为了避免这种情况,给线程提供了一些时间片,这样经过一段时间后,运行中的线程必须释放CPU。这样,其他等待的线程也有机会运行它们的任务。
在上图中,每个线程被分配2秒的时间片。因此,2秒后,第一个线程释放CPU,然后CPU被Thread2占用。其他线程也是同样的过程。
抢占式优先级调度:
调度算法的名称表示与线程的优先级有关。
假设有多个线程处于可运行状态。线程调度器选择具有最高优先级的线程。由于该算法是抢占式的,因此也为线程提供时间片以避免饥饿。因此,经过一段时间,即使最高优先级的线程尚未完成其任务,也必须由于抢占而释放CPU。
Java线程调度器的工作原理
让我们理解Java线程调度器的工作原理。假设有五个具有不同到达时间和不同优先级的线程。现在,线程调度器有责任决定哪个线程将首先获得CPU。
线程调度器选择具有最高优先级的线程,该线程开始执行作业。如果一个线程已经处于可运行状态,并且另一个具有较高优先级的线程到达可运行状态,则当前线程将从处理器中抢占,并且具有较高优先级的到达线程获得CPU时间。
当具有相同优先级和到达时间的两个线程(Thread 2和Thread 3)时,调度将根据FCFS算法决定。因此,先到达的线程有机会首先执行。