Skip to content

Commit 86cdbcd

Browse files
committed
feat: Add AgingScheduling new algorithm with Junit tests
1 parent bcf4034 commit 86cdbcd

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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+
public void addTask(String name, int priority) {
37+
taskQueue.offer(new Task(name, priority));
38+
}
39+
40+
public String scheduleNext() {
41+
if (taskQueue.isEmpty()) {
42+
return null;
43+
}
44+
Task nextTask = taskQueue.poll();
45+
nextTask.waitTime++;
46+
nextTask.priority += nextTask.waitTime;
47+
taskQueue.offer(nextTask);
48+
return nextTask.name;
49+
}
50+
}
Lines changed: 54 additions & 0 deletions
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)