Skip to content

Commit 1d19449

Browse files
authored
Add AgingScheduling algorithm (#5813)
1 parent acbce00 commit 1d19449

File tree

3 files changed

+118
-0
lines changed

3 files changed

+118
-0
lines changed

DIRECTORY.md

+2
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@
523523
* Recursion
524524
* [GenerateSubsets](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/Recursion/GenerateSubsets.java)
525525
* scheduling
526+
* [AgingScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/AgingScheduling.java)
526527
* diskscheduling
527528
* [CircularLookScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/CircularLookScheduling.java)
528529
* [CircularScanScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/CircularScanScheduling.java)
@@ -1123,6 +1124,7 @@
11231124
* Recursion
11241125
* [GenerateSubsetsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/Recursion/GenerateSubsetsTest.java)
11251126
* scheduling
1127+
* [AgingSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/AgingSchedulingTest.java)
11261128
* diskscheduling
11271129
* [CircularLookSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/CircularLookSchedulingTest.java)
11281130
* [CircularScanSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/CircularScanSchedulingTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import java.util.LinkedList;
4+
import java.util.Queue;
5+
6+
/**
7+
* AgingScheduling is an algorithm designed to prevent starvation
8+
* by gradually increasing the priority of waiting tasks.
9+
* The longer a process waits, the higher its priority becomes.
10+
*
11+
* Use Case: Useful in systems with mixed workloads to avoid
12+
* lower-priority tasks being starved by higher-priority tasks.
13+
*
14+
* @author Hardvan
15+
*/
16+
public final class AgingScheduling {
17+
18+
static class Task {
19+
String name;
20+
int waitTime;
21+
int priority;
22+
23+
Task(String name, int priority) {
24+
this.name = name;
25+
this.priority = priority;
26+
this.waitTime = 0;
27+
}
28+
}
29+
30+
private final Queue<Task> taskQueue;
31+
32+
public AgingScheduling() {
33+
taskQueue = new LinkedList<>();
34+
}
35+
36+
/**
37+
* Adds a task to the scheduler with a given priority.
38+
*
39+
* @param name name of the task
40+
* @param priority priority of the task
41+
*/
42+
public void addTask(String name, int priority) {
43+
taskQueue.offer(new Task(name, priority));
44+
}
45+
46+
/**
47+
* Schedules the next task based on the priority and wait time.
48+
* The priority of a task increases with the time it spends waiting.
49+
*
50+
* @return name of the next task to be executed
51+
*/
52+
public String scheduleNext() {
53+
if (taskQueue.isEmpty()) {
54+
return null;
55+
}
56+
Task nextTask = taskQueue.poll();
57+
nextTask.waitTime++;
58+
nextTask.priority += nextTask.waitTime;
59+
taskQueue.offer(nextTask);
60+
return nextTask.name;
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNull;
5+
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class AgingSchedulingTest {
10+
11+
private AgingScheduling scheduler;
12+
13+
@BeforeEach
14+
public void setup() {
15+
scheduler = new AgingScheduling();
16+
}
17+
18+
@Test
19+
public void testAddAndScheduleSingleTask() {
20+
scheduler.addTask("Task1", 5);
21+
assertEquals("Task1", scheduler.scheduleNext());
22+
}
23+
24+
@Test
25+
public void testAddMultipleTasks() {
26+
scheduler.addTask("Task1", 1);
27+
scheduler.addTask("Task2", 1);
28+
assertEquals("Task1", scheduler.scheduleNext());
29+
assertEquals("Task2", scheduler.scheduleNext());
30+
}
31+
32+
@Test
33+
public void testPriorityAdjustmentWithWait() {
34+
scheduler.addTask("Task1", 1);
35+
scheduler.addTask("Task2", 1);
36+
scheduler.scheduleNext();
37+
scheduler.scheduleNext();
38+
assertEquals("Task1", scheduler.scheduleNext());
39+
}
40+
41+
@Test
42+
public void testEmptyScheduler() {
43+
assertNull(scheduler.scheduleNext());
44+
}
45+
46+
@Test
47+
public void testMultipleRounds() {
48+
scheduler.addTask("Task1", 1);
49+
scheduler.addTask("Task2", 2);
50+
scheduler.scheduleNext();
51+
scheduler.scheduleNext();
52+
assertEquals("Task1", scheduler.scheduleNext());
53+
}
54+
}

0 commit comments

Comments
 (0)