Skip to content

Commit 7a539bc

Browse files
authored
Add SelfAdjustingScheduling algorithm (#5811)
1 parent 32cb98d commit 7a539bc

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed

DIRECTORY.md

+2
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,7 @@
539539
* [NonPreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/NonPreemptivePriorityScheduling.java)
540540
* [PreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/PreemptivePriorityScheduling.java)
541541
* [RRScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/RRScheduling.java)
542+
* [SelfAdjustingScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SelfAdjustingScheduling.java)
542543
* [SJFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SJFScheduling.java)
543544
* [SlackTimeScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java)
544545
* [SRTFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SRTFScheduling.java)
@@ -1136,6 +1137,7 @@
11361137
* [NonPreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/NonPreemptivePrioritySchedulingTest.java)
11371138
* [PreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/PreemptivePrioritySchedulingTest.java)
11381139
* [RRSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/RRSchedulingTest.java)
1140+
* [SelfAdjustingSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SelfAdjustingSchedulingTest.java)
11391141
* [SJFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SJFSchedulingTest.java)
11401142
* [SlackTimeSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SlackTimeSchedulingTest.java)
11411143
* [SRTFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SRTFSchedulingTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import java.util.PriorityQueue;
4+
5+
/**
6+
* SelfAdjustingScheduling is an algorithm where tasks dynamically adjust
7+
* their priority based on real-time feedback, such as wait time and CPU usage.
8+
* Tasks that wait longer will automatically increase their priority,
9+
* allowing for better responsiveness and fairness in task handling.
10+
*
11+
* Use Case: Real-time systems that require dynamic prioritization
12+
* of tasks to maintain system responsiveness and fairness.
13+
*
14+
* @author Hardvan
15+
*/
16+
public final class SelfAdjustingScheduling {
17+
18+
private static class Task implements Comparable<Task> {
19+
String name;
20+
int waitTime;
21+
int priority;
22+
23+
Task(String name, int priority) {
24+
this.name = name;
25+
this.waitTime = 0;
26+
this.priority = priority;
27+
}
28+
29+
void incrementWaitTime() {
30+
waitTime++;
31+
priority = priority + waitTime;
32+
}
33+
34+
@Override
35+
public int compareTo(Task other) {
36+
return Integer.compare(this.priority, other.priority);
37+
}
38+
}
39+
40+
private final PriorityQueue<Task> taskQueue;
41+
42+
public SelfAdjustingScheduling() {
43+
taskQueue = new PriorityQueue<>();
44+
}
45+
46+
public void addTask(String name, int priority) {
47+
taskQueue.offer(new Task(name, priority));
48+
}
49+
50+
public String scheduleNext() {
51+
if (taskQueue.isEmpty()) {
52+
return null;
53+
}
54+
Task nextTask = taskQueue.poll();
55+
nextTask.incrementWaitTime();
56+
taskQueue.offer(nextTask);
57+
return nextTask.name;
58+
}
59+
60+
public boolean isEmpty() {
61+
return taskQueue.isEmpty();
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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 SelfAdjustingSchedulingTest {
10+
11+
private SelfAdjustingScheduling scheduler;
12+
13+
@BeforeEach
14+
public void setup() {
15+
scheduler = new SelfAdjustingScheduling();
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", 5);
27+
scheduler.addTask("Task2", 1);
28+
scheduler.addTask("Task3", 3);
29+
assertEquals("Task2", scheduler.scheduleNext());
30+
assertEquals("Task2", scheduler.scheduleNext());
31+
assertEquals("Task3", scheduler.scheduleNext());
32+
}
33+
34+
@Test
35+
public void testPriorityAdjustment() {
36+
scheduler.addTask("Task1", 1);
37+
scheduler.addTask("Task2", 1);
38+
scheduler.scheduleNext();
39+
scheduler.scheduleNext();
40+
scheduler.scheduleNext();
41+
assertEquals("Task2", scheduler.scheduleNext());
42+
}
43+
44+
@Test
45+
public void testEmptyScheduler() {
46+
assertNull(scheduler.scheduleNext());
47+
}
48+
49+
@Test
50+
public void testTaskReschedulingAfterWait() {
51+
scheduler.addTask("Task1", 1);
52+
scheduler.addTask("Task2", 2);
53+
scheduler.scheduleNext();
54+
scheduler.scheduleNext();
55+
assertEquals("Task1", scheduler.scheduleNext());
56+
}
57+
}

0 commit comments

Comments
 (0)